Hibernate集合映射中的inverse属性以及cascade级联

来源:互联网 发布:南音吉他小屋 淘宝 编辑:程序博客网 时间:2024/05/18 11:48

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




原创粉丝点击