Hibernate区别小结

本文详细解析了Hibernate中的cascade和inverse的区别、作用时机、适用场景,并提供了建议和注意事项,帮助开发者正确理解和使用这两个特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、cascade和inverse的区别:

两者都是面试的热点,所以务必搞清楚。

1.inverse只对set+one-to-many(或many-to-many)有效,对many-to-one, one-to-one无效。cascade对关系标记都有效。

2.inverse对集合对象整体起作用,cascade对集合对象中的一个一个元素起作用,如果集合为空,那么cascade不会引发关联操作。
比如将集合对象置为null, school.setStudentSet(null)
inverse导致hibernate执行:udpate STUDENT set SCHOOL_ID=null where SCHOOL_ID=?
cascade则不会执行对STUDENT表的关联更新, 因为集合中没有元素

3.两个起作用的时机不同:
cascade:在对主控方操作时,级联发生。
inverse: 在flush时(commit会自动执行flush),对session中的所有set,hibernate判断每个set是否有变化,
对有变化的set执行相应的sql,执行之前,会有个判断:if( inverse == true ) return;

可以看出cascade在先,inverse在后。

4.inverse 对set + one-to-many 和 set + many-to-many 起的作用不同。hibernate生成的sql不同。
对one-to-many,hibernate对many方的数据库表执行update语句。
对many-to-many, hibernate对关系表执行insert/update/delte语句,注意不是对many方的数据库表而是关系表

5.建议:只对set + many-to-many设置inverse=false,其他的标记不考虑inverse属性,都设为inverse=true。

对cascade,一般对many-to-one,many-to-many,constrained=true的one-to-one 不设置级联删除。

 

 

 

 

二、load和get区别

load先到缓存中去查,如果没有则返回一个代理对象(不马上到DB中去找),等后面使用这个代理对象

操作的时候,才到DB中。如还没有找到return Exception
get先到缓存中去查,如果没有就到DB中去查,还没有的话return null
 总之,如果你确定DB中有这个对象就用load(),不确定就用get()(这样效率高)

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值