对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内容,子表也会自动修改。
是配置出了问题?
配置文件如下
主表
<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内容,子表也会自动修改。
是配置出了问题?
解决方案 »
- itext怎样生成超链接???
- 有关hibernate的菜鸟问题
- axis1.4 开发的webservice tomcat5.x 下没问题,was6.1上报错
- 如何通过修改xpath表达式更改xquery的结果类型?
- 用eclipse编写一个struts程序后,Tomcat启动时出现了以下错误(分不多了,请求帮忙)
- 关于Spring的配置问题
- 客户钱没付完,想要原代码,是否要给他?
- 关于struts公共menubar的问题
- 高分求助标准 JAVA中读取XML文件的范例
- 在Applet中如何调用javascript中的函数并获得返回值?
- JAVA普通Class如何得到tomcat的路径
- java语言使用poi框架导入excel表的记录行数只能在15行之内,不能超过15行。
<key>
<column name="PROTOTYPEOVERSEAID" /><!-- 子表的外键 -->
</key>
<one-to-many class="PrototypeOverseaItem" /><!-- 子表的关联class -->
</set>
inverse如果为true,就是说你取消了主表对从表的关系操作,即如果你操作主表,主表没有权限删除从表中的数据,你将值改为false或者是取掉缺省就是false;
还有就是<key>
<column name="PROTOTYPEOVERSEAID" /><!-- 子表的外键 -->
</key> 这个应该是主表的主键.
目前就看到这二点.
2.one-to-many设置inverse="true" cascade="all",则对子表的修改和添加都没问题,只是直接减少子表set集合时候,对集合的减少修改,不会引发数据库对子表的删除,子表数据不会被删除。
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集合时候,对集合的减少修改,不会引发数据库对子表的删除,子表数据不会被删除。