【Hibernate】的inverse与cascade区别?

Cascade:

  • Save-update 
    在session.save/update一个对象的时候,级联操作关联对象,关联对象或者执行save语句或者执行update语句或者什么都不执行
  • Delete 
    在session.delete一个对象的时候,级联删除关联对象
  • All 
    Save-update和delete的结合
2.inverse

inverse属性用于指示本方是否参与维护关系,设为true时不维护,设为false时维护。此处的关系是指关联两张表的

外键或者关系表字段。本属性一般设置于一对多关系中的一端,并且设置为false,因为若由一端负责维护,每次更新完一端数据,都会去寻找于一端有关系的多段表中的行,并更新其外键字段。而由多端维护时,由于一端对象是多端对象的属性字段,所以,每次更新多端后提交数据,都会自动更新该字段(若有更新时),这样比较方便。

3.Cascade与inverse的区别 student 与 classes
  • cascade描述的是对象与对象之间的关系
cascade和外键没有关系,在student表中,sid、name、description和cascade有关系,但是cid和cascade没有关系。
  • inverse描述的是对象与外键之间的关系
inverse只和cid有关系,如果维护,则发出update语句(更新外键的sql语句),如果不维护,则不管。
  • inverse属性默认是false的,就是说关系的两端都来维护关系。当设置inverse=”true”时则不维护
4.只有inverse没有cascade的时候:

对于数据中不存在的classes和student时:把student设置给classes时,仅仅保存classes而不直接保存student时只会执行insert classes的方法而对于student(即使不存在)不会insert而仅仅会update(由于在同一个事物中所以最终导致classes也不能被保存)

当要保存的classes设置的student是数据库中存在的时候,会对其执行update方法,而如果对classes设置了cascade,则会对不存在的student设置insert:

当给classes设置inverse=”true”时,则表示classes不维护和student的外键关系。此时当删除一个classes时,由于classes不维护与student的关系,顾不会发出update语句所以会报错。而如果classes没有设置inverse=”true”,即inverse=”false”,则说明classes维护关系。故当删除classes时会发出update student的语句,故可以删除成功.

5.正确的设置inverse

我们说inverse设立不当会导致性能低下,其实是说inverse设立不当,会产生多余重复的SQL语句甚至致使JDBC exception的throw。这是我们在建立实体类关系时必须需要关注的地方。一般来说,inverse=true是推荐使用,双向关联中双方都设置 inverse=false的话,必会导致双方都重复更新同一个关系。但是如果双方都设立inverse=true的话,双方都不维护关系的更新,这也是不行的,好在一对多中的多端:one-to-many默认是inverse=false,避免了这种错误的产生。但是多对多就没有这个默认设置了,所以很多人经常在多对多的两端都使用inverse=true,结果导致连接表的数据根本没有记录,就是因为他们双方都没有责任维护关系。所以说,双向关联中最好的设置是一端为inverse=true,一端为inverse=false。一般inverse=false会放在多的一端,那么有人提问了, many-to-many两边都是多的,inverse到底放在哪儿?其实hibernate建立多对多关系也是将他们分离成两个一对多关系,中间连接一个连接表。所以通用存在一对多的关系,也可以这样说:一对多是多对多的基本组成部分。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值