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