【极客营】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

【极客营】Hibernate完成CRM的联系人的保存操作-技术分析之让某一方放弃外键的维护,为多对多做准备

 解决方法:

采用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语句

【极客营】Hibernate完成CRM的联系人的保存操作-技术分析之让某一方放弃外键的维护,为多对多做准备

一般,我们都让1方放弃外键维护权!

1.2.   技术分析之cascade和inverse的区别

1. cascade用来级联操作(保存、修改和删除) 在一方设置
2.inverse用来维护外键的  在一方设置