Hibernate之inverse和cascade详解

继Hibernate学习笔记整理之后,发现inverse和cascade这两个属性在配置过程中比较含糊,仔细比较一下是有些地方比较像,所以很容易搞糊涂。借助此文来阐述下inverse和cascade的区别。

什么是inverse?
默认值为false;也就是双方都可以维护关系。如果在一方中显示的设置为false的话那么就意味着本方维护关系。如果设置为true的话表示本方不维护关联关系。
只是影响是否能设置外键列的值(设成有效值或是null值),对获取信息没有影响。如果两端都设置为true的时候是不对的,这样的情况下会导致没有人维护关联关系。

什么是Cascade?
默认是none。表示不级联。
all:所有情况下都进行关联操作。
save-update:在执行save/update/saveorupdate的时候进行关联操作。
delete:在delete的时候进行关联操作。
什么意思呢?
就是说:当A、B两个对象有关联关系的时候,如果这时候映射时设置为delete的话,那么在删除A的时候会级联的删除B。使得数据保持完整性约束。

什么不同呢?
inverse和cascade没有什么关系。
Commit后,这两个属性发挥作用的时间是不一样的,Hibernate会根据对象的改变,以及casade的属性的设置生成一系列的action,比如增删改的action,每个action都有自己的execute方法以及执行的sql语句。当所有的action生成好之后,Hibernate会执行他们,这时候检查inverse属性的值,如果设置为true那么不执行,如果是false的话就执行sql。
cascade是在主控方操作的时候级联发生的。inverse:在提交后flush时,对session的所有set,Hibernate会判断有没有更新,如果有对对应的有变化的set执行sql,执行sql之前先判断inverse,if(inverse == true) return;

Hibernate 优化:inverse
inverse在多对多的关系中发挥作用不大(对运行的效率来说),但是在一对多的关联关系中作用是巨大的,一对多的关系中,如果设置为一的一方维护关联关系,那么每次改变(比如说:删除)“一”的一方数据时,因为“一”的这一方要维护关联关系那么势必要改变多个“多”的一方中表中关联的数据。因为“多”的这一方数据是很多的,让“一”的一方来维护的话那么就会更新多次“多”的一方的数据,如果让多方维护数据的时候,如果“一”的一方删除时只需要设置多的一方的与之关联的数据列为null即可。
当一的这方加载对象内容的时候,一这方维护关系那么会主动去加载多的这方所与之关联的对象,而当多这一方维护关联关系的时候,则效率就大大提升了,多的一方只需要加载一方的内容就可以了,这样的话所需要的代价更低。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值