继续上一篇博客介绍的级联继续如下理解
inverse的值是boolean值,也就是能设置为true或false。 如果一方的映射文件中设置为true,说明在映射关系(一对多,多对多等)中让对方来维护关系。如果为false,就自己来维护关系。默认值是true。 并且这属性只能在一端设置。比如一对多,这个一端。也就是在有set集合的这方设置。
tb_factory.hbm.xml的文件如下:
<!-- inverse="true",让对方维护关系,此时这里的cascade设置没什么用,因为自身不维护关系,它也就失效了。 -->
<set name="books" inverse="true" cascade="save-update" >
<key column="factoryid"></key>
<one-to-many class="com.book.web3.Book" />
</set>
tb_books.hbm.xml
<!-- 这个级联就有用,因为是让自己这方维护关系 -->
<many-to-one name="factory" class="com.book.web3.Factory" cascade="all" > <!--所有情况下均进行关联操作,即save-update和delete。 -->
<column name="factoryid"></column>
</many-to-one>
总结:
对于设置了cascade就可以维护双方关系,为什么还要设置inverse呢,这是由于
Inverse:负责控制关系,默认为false,也就是关系的两端都能控制,但这样会造成一些问题,更新的时候会因为两端都控制关系,于是重复更新。一般来说有一端要设为true
到这里,inverse和cascade这两个的作用就已经讲解完了
1、inverse的权限在cascade之上,意思就是cascade是否有用,还得看inverse这个属性
2、inverse的作用:在映射关系中,让其中一方去维护关系,好处就是能提高性能,不用重复维护。维护两种关系,看下
2.1 控制级联关系是否有效
cascade是否有效,就得看inserve的值,如果是自己方来维护关系,那么cascade就有效,反之无效
2.2 控制外键关系
这个就得通过让自己拥有对方的实例引用(可能是set,也可能就是单个存储对象的变量),这样才具备控制外键关系的能力,然后看inserve的值,
3、inverse只能在一的一方设置,并且默认值是true,也就是说,不设置inverse时,默认是让多的一方去维护关系,这种一般是在双向、外键关系中才设置inverse的值,如果是单向的,就只有一方有维护关系的权利。
4、通过学习这两个属性,在测试代码中,就不必那么麻烦了,只需要考虑维护关系的一方,另一方就会自动保存了。