Inverse
和
cascade
是
Hibernate
映射中最难掌握的两个属性。两者都在对象的关联操作中发挥作用。
1.inverse 属性: inverse 所描述的是对象之间关联关系的维护方式。
inverse 只存在于集合标记的元素中。 Hibernate 提供的集合元素包括 <set/> <map/> <list/> <array /> <bag />
Inverse 属性的作用是:是否将对集合对象的修改反映到数据库中。
inverse 属性的默认值为 false ,表示对集合对象的修改会被反映到数据库中
inverse=”true” 表示对集合对象的修改不会被反映到数据库中。
<one-to-many> 中 inverse 的属性的设置
例: Person 中包含一个 Child 集合, Child 包含一个 Person 对象。
要求:新建 Person 和 Child 对象, Child 属于此 Person 对象
分析:在数据库中,就是新增一条 Child 记录
//one-to-many的inverse的配置
public void testInverse() {
Qx qx = new Qx();
qx.setQx("天山区");
Jd jd = new Jd();
jd.setJd("人民路");
qx.getJds().add(jd);
jd.setQx(qx);
super .add(qx);
super .add(jd);
}
配置 Inverse=”false” , Hibernate 的操作:
(1)Hibernate: insert into TBL_QX (qx) values (?)
(2)Hibernate: insert into TBL_JD (jd, qxid) values (?, ?)
(3)Hibernate: update TBL_JD set qxid=? where jdid=?
配置 Inverse=”true” , Hibernate 的操作
(1)Hibernate: insert into TBL_QX (qx) values (?)
(2)Hibernate: insert into TBL_JD (jd, qxid) values (?, ?)
可以看出: Inverse=”true” , SQL 少执行一条更新操作( Java 代码不会少)
<many-to-many> 中 inverse 的属性的设置
在多对多的关系中,可以在关联的两边都不设置 inverse 属性(默认的 false ) , 那么说明关联的双方都可以维护两个对象之间的关联关系。
注:在设置多对多关系的 inverse 属性时,不能两个对象都将其设置为 true
2.cascade 属性
cascade 属性的作用是描述关联对象进行操作时的级联特性。因此,只有涉及到关系的元素才有 cascade 属性。
具有 cascade 属性的标记包括 <many-to-one /> <one-to-one /> <any /> <set /> <bag /> <idbag /> <list /> <array />
注意: <ont-to-many /> 和 <many-to-many /> 是用在集合标记内部的,所以是不需要 cascade 属性的。
级联操作:指当主控方执行某项操作时,是否要对被关联方也执行相同的操作。
3.inverse 和 cascade 的区别
作用的范围不同:
Inverse 是设置在集合元素中的。
Cascade 对于所有涉及到关联的元素都有效。
<many-to-one/><ont-to-many/> 没有 inverse 属性,但有 cascade 属性
执行的策略不同
Inverse 会首先判断集合的变化情况,然后针对变化执行相应的处理。
Cascade 是直接对集合中每个元素执行相应的处理
执行的时机不同
Inverse 是在执行 SQL 语句之前判断是否要执行该 SQL 语句
Cascade 则在主控方发生操作时用来判断是否要进行级联操作
执行的目标不同
Inverse 对于 <ont-to-many> 和 <many-to-many> 处理方式不相同。
对于 <ont-to-many> , inverse 所处理的是对被关联表进行修改操作。
对于 <many-to-many> , inverse 所处理的则是中间关联表
Cascade 不会区分这两种关系的差别,所做的操作都是针对被关联的对象。
总结:
<one-to-many> 中,建议 inverse=”true”,由“many”方来进行关联关系的维护
<many-to-many> 中,只设置其中一方 inverse=”false” ,或双方都不设置
1.inverse 属性: inverse 所描述的是对象之间关联关系的维护方式。
inverse 只存在于集合标记的元素中。 Hibernate 提供的集合元素包括 <set/> <map/> <list/> <array /> <bag />
Inverse 属性的作用是:是否将对集合对象的修改反映到数据库中。
inverse 属性的默认值为 false ,表示对集合对象的修改会被反映到数据库中
inverse=”true” 表示对集合对象的修改不会被反映到数据库中。
<one-to-many> 中 inverse 的属性的设置
例: Person 中包含一个 Child 集合, Child 包含一个 Person 对象。
要求:新建 Person 和 Child 对象, Child 属于此 Person 对象
分析:在数据库中,就是新增一条 Child 记录
//one-to-many的inverse的配置
public void testInverse() {
Qx qx = new Qx();
qx.setQx("天山区");
Jd jd = new Jd();
jd.setJd("人民路");
qx.getJds().add(jd);
jd.setQx(qx);
super .add(qx);
super .add(jd);
}
配置 Inverse=”false” , Hibernate 的操作:
(1)Hibernate: insert into TBL_QX (qx) values (?)
(2)Hibernate: insert into TBL_JD (jd, qxid) values (?, ?)
(3)Hibernate: update TBL_JD set qxid=? where jdid=?
配置 Inverse=”true” , Hibernate 的操作
(1)Hibernate: insert into TBL_QX (qx) values (?)
(2)Hibernate: insert into TBL_JD (jd, qxid) values (?, ?)
可以看出: Inverse=”true” , SQL 少执行一条更新操作( Java 代码不会少)
<many-to-many> 中 inverse 的属性的设置
在多对多的关系中,可以在关联的两边都不设置 inverse 属性(默认的 false ) , 那么说明关联的双方都可以维护两个对象之间的关联关系。
注:在设置多对多关系的 inverse 属性时,不能两个对象都将其设置为 true
2.cascade 属性
cascade 属性的作用是描述关联对象进行操作时的级联特性。因此,只有涉及到关系的元素才有 cascade 属性。
具有 cascade 属性的标记包括 <many-to-one /> <one-to-one /> <any /> <set /> <bag /> <idbag /> <list /> <array />
注意: <ont-to-many /> 和 <many-to-many /> 是用在集合标记内部的,所以是不需要 cascade 属性的。
级联操作:指当主控方执行某项操作时,是否要对被关联方也执行相同的操作。
3.inverse 和 cascade 的区别
作用的范围不同:
Inverse 是设置在集合元素中的。
Cascade 对于所有涉及到关联的元素都有效。
<many-to-one/><ont-to-many/> 没有 inverse 属性,但有 cascade 属性
执行的策略不同
Inverse 会首先判断集合的变化情况,然后针对变化执行相应的处理。
Cascade 是直接对集合中每个元素执行相应的处理
执行的时机不同
Inverse 是在执行 SQL 语句之前判断是否要执行该 SQL 语句
Cascade 则在主控方发生操作时用来判断是否要进行级联操作
执行的目标不同
Inverse 对于 <ont-to-many> 和 <many-to-many> 处理方式不相同。
对于 <ont-to-many> , inverse 所处理的是对被关联表进行修改操作。
对于 <many-to-many> , inverse 所处理的则是中间关联表
Cascade 不会区分这两种关系的差别,所做的操作都是针对被关联的对象。
总结:
<one-to-many> 中,建议 inverse=”true”,由“many”方来进行关联关系的维护
<many-to-many> 中,只设置其中一方 inverse=”false” ,或双方都不设置
Cascade,通常情况下都不会使用。特别是删除,一定要慎重
本文转自左正博客园博客,原文链接:http://www.cnblogs.com/soundcode/archive/2010/12/20/1911934.html,如需转载请自行联系原作者