本文主要是介绍【极客营】Hibernate完成CRM的联系人的保存操作-技术分析之让某一方放弃外键的维护,为多对多做准备,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
作者:何征天
课程视频地址:https://ke.qq.com/course/273907
1.1. 技术分析之让某一方放弃外键的维护,为多对多做准备
1. 先测试双方都维护外键的时候,会产生多余的SQL语句。
* 想修改客户和联系人的关系,进行双向关联,双方都会维护外键,会产生多余的SQL语句。
* 产生的原因:session的一级缓存中的快照机制,会让双方都更新数据库,产生了多余的SQL语句。
2. 如果不想产生多余的SQL语句,那么需要一方来放弃外键的维护!
* 在<set>标签上配置一个inverse=”true”.true:放弃.false:不放弃.默认值是false
* <inverse="true">
1.1.1. inverse示例
问题:多余sql的问题
将没有关系的一个客户和联系人建立关系。(双方)
1.在TestOne2Many类中添加测试代码
//inverse放弃外键维护 @Test publicvoid run7(){ Session session = HibernateUtils.getCurrentSession(); Transaction tr = session.beginTransaction(); //获取一个客户 Customer c = session.get(Customer.class, 7L); //获取一个联系人 Linkman m = session.get(Linkman.class, 8L); //联系人与客户做双向关联 c.getLinkmans().add(m); m.setCustomer(c);
tr.commit(); } |
产生的sql:多余sql
解决方法:
采用inverse属性来配置。
2. 修改Customer.hbm.xml
<set name="linkmans" inverse="true" > <key column="lkm_cust_id"></key> <one-to-many class="com.igeek.demo1.Linkman"/> </set> |
3. 修改中数据,再次测试,hibernate只发一条sql语句
一般,我们都让1方放弃外键维护权!
1.2. 技术分析之cascade和inverse的区别
1. cascade用来级联操作(保存、修改和删除) 在一方设置
2.inverse用来维护外键的 在一方设置
这篇关于【极客营】Hibernate完成CRM的联系人的保存操作-技术分析之让某一方放弃外键的维护,为多对多做准备的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!