inverse与cascade属性使用详解
在映射一对多的双向关联关系时,应该在"one"方把inverse设为true,这样可以提高性能
关于inverse在one-to-many外键关联(双向关联)中的作用:P.155 孙卫琴-《精通Hibernate:Java对象持久化技术详解》
Order.hbm.xml设置:
column="CUSTOMER_ID"
class="mypack.Customer"
cascade="save-update" />
Customer.hbm.xml设置:
cascade="all"
inverse="true">
以上代码表明在Customer和Order的双向关联关系中,Customer端的关联只是Order端关系的镜像。当Hibernate探测到持久化对象Customer和Order的状态均发生变化时,
公按照Order对象状态的变化来同步更新数据库。
我理解的是这两者是没什么关系的,各管各的事情。
inverse只有在集合映射中才有,当inverse = true,字面意思好像是反转,由对方来维护关系,但实际还要看对方的配置,实际意思就是我不维护这个关系。
当inverse = false意思就是我要维护这个关系,维护关系表现在行动上就是对于加入到这个集合或者从集合中移除的对象,对它的外键进行更新操作,使它与自己关联起来,将它的外键值设为null就是与自己脱离关系,或者是对中间表的操作(增删中间表的关联记录)。
inverse不会去删除对方这个对象,而cascade则可以级联删除或插入对方。
inverse作用的基础是对方这个对象在数据库中存在,与cascade配合使用,作用的顺序也是cascade在前inverse在后。
所以对于多对一双向关联,因为多方已经可以建立关联关系,所以在"one"方一般会设inverse = true.
对于多对多双向关联来说,则至少要有一方设置进行关联维护。
inverse主要用于 双向关联的set+one-to-many(或many-to-many)有效,
对many-to-one, one-to-one无效。cascade对关系标记都有效。
cascade和inverse有什么区别?
可以这样理解,cascade定义的是关系两端对象到对象的级联关系;而inverse定义的是关系和对象的级联关系。
inverse对集合对象整体起作用,cascade对集合对象中的一个一个元素起作用,如果集合为空,那么cascade不会引发关联操作。
比如将集合对象置为null, school.setStudentSet(null)
inverse导致hibernate执行:udpate STUDENT set SCHOOL_ID=null where SCHOOL_ID=?
cascade则不会执行对STUDENT表的关联更新, 因为集合中没有元素。
编辑推荐:
2014年java认证考试专业语言辅导之Java开源技术汇总
相关链接:JAVA认证考试报考指南 考试论坛 考试知道 考试动态
(责任编辑:中原茶仙子)