在hibernate中,一对多和多对多时会涉及到cascade和inverse两个属性,其中cascade表示哪些操作需要级联到关联对象,inverse表示是否由另一方自动维护数据库关联。
一、
级联指的是当主控方执行操作时,关联对象(被动方)是否同步执行同一操作。主控方即为cascade所在映射文件所对应的对象。
一个操作因级联cascade可能触发多个关联操作。前一个操作叫“主控操作”,后一个操作叫“关联操作”。
cascade属性的可选值:
all : 所有情况下均进行关联操作。
none:所有情况下均不进行关联操作。这是默认值。
save-update:在执行save/update/saveOrUpdate时进行关联操作。
delete:在执行delete时进行关联操作。
具体执行什么“关联操作”是根据“主控操作”来的:
“主控操作” “关联操作”
session.saveOrUpdate --> session.saveOrUpdate (执行saveOrUpdate实际上会执行save或者update)
session.save ----> session.saveOrUpdate
session.udpate --> session.saveOrUpdate
session.delete --> session.delete
二、
inverse为false表示由本对象维护关联关系,为true表示由对方维护关联关系。
三、
inverse对集合对象整体起作用,cascade对集合对象中的一个一个元素起作用,如果集合为空,那么cascade不会引发关联操作。
四、
比如有如下的映射关系:
A.hbm.xml:
<set name="bs" table="A_Btable" cascade="none" inverse="false" lazy="true">
<key column="A_NO" />
<many-to-many column="B_NO" class="B" />
</set>
B.hbm.xml:
<set name="as" table="A_Btable" cascade="none" inverse="false" lazy="true">
<key column="B_NO" />
<many-to-many column="A_NO" class="A" />
</set>
由映射文件可知A和B中都分别含有对方的对象集合,分别为bs和as,这是一个双向多对多映射。
cascade为none表示在对A的对象进行操作时,并不对bs集合中的每个对象进行相应的操作,如果为all,则表示在对A进行操作时需对bs中的每个对象进行相应的关联操作(对应操作见一)。在对bs中的对象进行级联操作时也会根据B中设置的映射关系对as中的对象进行所设置的关联操作。
inverse为false表示在A对象进行更新的同时也要维护A与B之间的关系,即对A_Btable进行相应的更新,否则不对A_Btable进行更新。在多对多或多对一的映射中必须要有一方维护关联关系,否则,就得显示地进行维护,这可能会带来麻烦。
特别需要注意的是若双方都设置为“cascade=all inverse=false”,最严重时会造成A表、B表和A_Btable表中数据全部丢失。
五、
inverse只对set+one-to-many(或many-to-many)有效,对many-to-one, one-to-one无效。cascade对关系标记都有效
inverse 对set + one-to-many 和 set + many-to-many 起的作用不同。hibernate生成的sql不同。
对one-to-many,hibernate对many方的数据库表(不是连接表,一般情况下也没有)执行update语句。
对many-to-many, hibernate对关系表执行insert/update/delte语句,注意不是对many方的数据库表而是关系表(即所谓的连接表)。
cascase 对<set>都是一致的,不管one-to-many还是many-to-many。都简单地把操作传递到set中的每个元素。所以它总是更新many
方的数据库表。
分享到:
相关推荐
Hibernate中Cascade和inverse的区别,讲解的很详细
Hibernate中cascade和inverse应用
Hibernate中cascade与inverse属性详解
于Hibernate中 cascade 与 inverse 的理解。 您买的Hibernate书是哪一本呢? 孙卫琴的精通Hibernate,还是 深入浅出Hibernate还是那本。。。 我是两本都买了,总体来说还可以,但是,有的地方讲的比较书面化,比如...
hibernate 级联(cascade和inverse)一对多,Jar包,数据库建表语句都好了,只要修改一下,数据库配置文件,就可以使用了,使用junit进行测试。
hibernate inverse和cascade的详细讲解,相当详细全面的对inverse和cascade区别和用法的讲解
inverse Hibernate_级联关系说明_-_关于cascade和inverse的用法
Hibernate中Inverse和Cascade的区别.html
hibernate集合映射inverse和cascade详解.txt
Hibernate中cascade和inverse的相关
该源程序代码可以帮助初学者迅速建立hibernate的关联映射的概念,且详细的讲解了cascade和inverse的用法,程序代码进行了详尽的描述,通俗易懂,容易上手
hibernate中一对一,一对多,多对多关系的配置,延迟加载,cascade,inverse hibernate查询方式概述,HQL查询,QBC查询,分页,结果集封装方式 ,高级查询 查询的优化,一级缓存,二级缓存,批量查询,注解方式
Hibernate fetch lazy cascade inverse 关键字
使用cascade和inverse优化区和街道关联关系 实现区和街道双向一对多关联关系
<set name="products" table="products" cascade="all" inverse="true"> <!-- Hibernate只会缓存对象的简单属性的值, 要缓存集合属性,必须在集合元素中也加入子元素 而Hibernate仅仅是把与当前持久对象关联的...
本章介绍一对多关联关系的映射方法,重点介绍inverse属性和cascade属性的用法。本章还将介绍通过Hibernate API来保存、修改和删除具有关联关系的对象的方法。 7.1 建立多对一的单向关联关系 148 7.1.1 [many-to-...
以上所有实体使用 JOINED 策略 Ferry和Boat class使用同名的主键关联(eg: Boat.id = Ferry.id), AmericaCupClass 和 Boat 关联的条件为 Boat.id = AmericaCupClass.BOAT_ID. 从父类继承的属性 @MappedSuperclass ...
持久化类的对象,在hibernate应用中可以处于三种状态(根据对象和session之间的关系进行划分): 1. 临时态,瞬态:特点: a) 在数据库中没有记录和它对应 b) 和session没有任何关系 c) New 出来的对象,都处于临时...
该资源包括了hibernate开发中的常见关联映射的源代码,其中包括:one2one,one2many,many2many等,还有继承映射,inverse,fetch,cascade关键字的应用等,对初学者来说,是很实用的,难度适中,很好理解