本文主要是介绍Hibernate集合映射中的inverse属性以及cascade级联,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Inverse属性
Inverse属性,是在维护关联关系的时候起作用的。
表示控制权是否转移。(在一的一方起作用)
Inverse , 控制反转。
Inverse = false 不反转; 当前方有控制权
True 控制反转; 当前方没有控制权
只在集合映射中才能使用。
注意:<one-to-many /> 和<many-to-one />中并没有这个属性
维护关联关系中,是否设置inverse属性:
1. 对保存数据有影响。
如果设置控制反转,即inverse=true, 然后通过部门方维护关联关系。在保存部门的时候,同时保存员工, 数据会保存,但关联关系不会维护。即外键字段为NULL
save操作测试
数据库:
2. 对于获取数据没有影响。(此处省略操作结果)
3. 对解除关联关系有影响。
inverse=false,(控制权还在Dept) 可以解除关联
inverse=true, 当前方(部门)没有控制权,不能解除关联关系,(不会生成update语句,也不会报错)
4. 对删除数据的关联关系有影响。
inverse=false, 有控制权, 可以删除。先清空外键引用,再删除数据。
inverse=true, 没有控制权: 如果删除的记录有被外键引用,会报错,违反主外键引用约束! 如果删除的记录没有被引用,可以直接删除。
cascade 属性
cascade 表示级联操作 【可以设置到一的一方或多的一方】
none 不级联操作, 默认值
save-update 级联保存或更新
delete 级联删除
save-update,delete 级联保存、更新、删除
all 同上。级联保存、更新、删除
cascade级联操作(这里以save-update为例)
我们看到级联之后操作员工表中并没有出现 与部门关联的 主键值。问题就出在我们将inverse设置为true了。
下面我们总结一下 ,inverse 和 cascade 的 区别:
作用的范围不同:
Inverse是设置在集合元素中的。
Cascade对于所有涉及到关联的元素都有效。
<many-to-one/><ont-to-many/>没有inverse属性,但有cascade属性
执行的策略不同
Inverse 会首先判断集合的变化情况,然后针对变化执行相应的处理。
Cascade 是直接对集合中每个元素执行相应的处理
执行的时机不同
Inverse是在执行SQL语句之前判断是否要执行该SQL语句
Cascade则在主控方发生操作时用来判断是否要进行级联操作
执行的目标不同
Inverse对于<ont-to-many>和<many-to-many>处理方式不相同。
对于<ont-to-many>,inverse所处理的是对被关联表进行修改操作。
对于<many-to-many>,inverse所处理的则是中间关联表
Cascade不会区分这两种关系的差别,所做的操作都是针对被关联的对象。
区别引用自https://www.cnblogs.com/zsping/p/5835765.html
这篇关于Hibernate集合映射中的inverse属性以及cascade级联的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!