`
flytreeleft
  • 浏览: 92034 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

hibernate中cascade和inverse的使用

阅读更多

在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
方的数据库表。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics