对hibernate刚入手,不得其精华 
配置文件如下 
主表 
<class name="PrototypeOversea" table="T_MT_PROTOTYPEOVERSEA"> 
<id name="sid" type="java.lang.Integer"> 
<column name="SID" precision="10" scale="0" /> 
<generator class="sequence"> 
<param name="sequence">SEQ_MT_PROTOOVERSEA</param> 
</generator> 
</id> 
<set name="items" cascade="all" inverse="true" lazy="false" order-by="ITEMID"> 
<key> 
<column name="PROTOTYPEOVERSEAID" /><!-- 子表的外键 --> 
</key> 
<one-to-many class="PrototypeOverseaItem" /><!-- 子表的关联class --> 
</set> 
</class> 
子表 <class name="PrototypeOverseaItem" table="T_MT_PROTOTYPEOVERSEAITEM"> 
<id name="itemId" type="java.lang.Integer"> 
<column name="ITEMID" precision="10" scale="0" /> 
<generator class="sequence"> 
<param name="sequence">SEQ_MT_PROTOOVERSEA_ITEM</param> 
</generator> 
</id> 
<!-- 
class 指定主表关联的class 
--> 
<many-to-one name="pos" class="PrototypeOversea" fetch="select" not-null="true"> 
<column name="PROTOTYPEOVERSEAID" precision="10" scale="0"> 
</column><!-- column为字表里和主表关联的外键 --> 
</many-to-one> 
</class> 
现在的问题是,当主表的set集合items减少时,子表不会自动删除set里没有的记录 
目前,主表的set集合items增加时,子表会自动添加set添加的记录,修改items内容,子表也会自动修改。
是配置出了问题?

解决方案 »

  1.   

    <set name="items" cascade="all" inverse="true" lazy="false" order-by="ITEMID">  
    <key>  
    <column name="PROTOTYPEOVERSEAID" /><!-- 子表的外键 -->  
    </key>  
    <one-to-many class="PrototypeOverseaItem" /><!-- 子表的关联class -->  
    </set>  
    inverse如果为true,就是说你取消了主表对从表的关系操作,即如果你操作主表,主表没有权限删除从表中的数据,你将值改为false或者是取掉缺省就是false;
    还有就是<key>  
    <column name="PROTOTYPEOVERSEAID" /><!-- 子表的外键 -->  
    </key> 这个应该是主表的主键.
    目前就看到这二点.
      

  2.   

    1.one-to-many设置inverse="false" cascade="all"则对子表的修改和删除都会出错,报错信息为无法更新 (PROTOTYPEOVERSEAITEM"."PROTOTYPEOVERSEAID") 为 NULL 
    2.one-to-many设置inverse="true" cascade="all",则对子表的修改和添加都没问题,只是直接减少子表set集合时候,对集合的减少修改,不会引发数据库对子表的删除,子表数据不会被删除。
      

  3.   

    比较乱了,重新发下完整的代码和数据库
    public class PrototypeOversea implements Serializable {
    private Integer sid;//主键
    private Set<PrototypeOverseaItem> items;//商品详细信息
    }public class PrototypeOverseaItem extends BaseEntity implements Serializable {
    private Integer itemId;
    private PrototypeOversea pos;
    }
    数据库
    -- Create table
    create table PROTOTYPEOVERSEA
    (
      SID number not null,
    )
    ;
    -- Create/Recreate primary, unique and foreign key constraints 
    alter table PROTOTYPEOVERSEA
      add constraint PROTOTYPEOVERSEA_PK primary key (SID);
    -- Create table
    create table PROTOTYPEOVERSEAITEM
    (
      ITEMID             number not null,
      PROTOTYPEOVERSEAID number not null
    )
    ;
    -- Create/Recreate primary, unique and foreign key constraints 
    alter table PROTOTYPEOVERSEAITEM
      add constraint PROTOTYPEOVERSEAITEM_PK primary key (ITEMID);
    alter table PROTOTYPEOVERSEAITEM
      add constraint PROTOTYPEOVERSEAITEM_FK1 foreign key (PROTOTYPEOVERSEAID)
      references prototypeoversea (SID);配置文件如下 
    主表 
    <class name="PrototypeOversea" table="PROTOTYPEOVERSEA"> 
    <id name="sid" type="java.lang.Integer"> 
    <column name="SID" precision="10" scale="0" /> 
    <generator class="assigned" /> 
    </id> 
    <set name="items" cascade="all" inverse="true" lazy="false" order-by="ITEMID"> 
    <key> 
    <column name="PROTOTYPEOVERSEAID" /><!-- 子表的外键 --> 
    </key> 
    <one-to-many class="PrototypeOverseaItem" /><!-- 子表的关联class --> 
    </set> 
    </class> 
    子表 <class name="PrototypeOverseaItem" table="PROTOTYPEOVERSEAITEM"> 
    <id name="itemId" type="java.lang.Integer"> 
    <column name="ITEMID" precision="10" scale="0" /> 
    <generator class="sequence"> 
    <param name="sequence">SEQ_MT_PROTOOVERSEA_ITEM</param> 
    </generator> 
    </id> 
    <!-- 
    class 指定主表关联的class 
    --> 
    <many-to-one name="pos" class="PrototypeOversea" fetch="select" not-null="true"> 
    <column name="PROTOTYPEOVERSEAID" precision="10" scale="0"> 
    </column><!-- column为字表里和主表关联的外键 --> 
    </many-to-one> 
    </class> 
    现在的问题是,当主表的set集合items减少时,子表不会自动删除set里没有的记录 
    目前,主表的set集合items增加时,子表会自动添加set添加的记录,修改items内容,子表也会自动修改。
    是配置出了问题?程序每次从前台jsp获取子表的set集合items,然后将此items设置到主表
    pos.setItems(items);
    是想实现,如果接收到的items是新的,子表就自动增加,修改了,子表就自动修改,现在的配置已经实现了这个。
    如果收到的items在页面上删除了,后台收到的就会减少,希望通过配置能实现自动删除减少的那部分数据。问题补充:
    1.one-to-many设置inverse="false" cascade="all"则对子表的修改和删除都会出错,报错信息为无法更新 (PROTOTYPEOVERSEAITEM"."PROTOTYPEOVERSEAID") 为 NULL 
    2.one-to-many设置inverse="true" cascade="all",则对子表的修改和添加都没问题,只是直接减少子表set集合时候,对集合的减少修改,不会引发数据库对子表的删除,子表数据不会被删除。
      

  4.   

    你把LAZY去掉然后再进行操作看看,是否还是同样的结果。