hibernate inverse


来源: http://www.java63.com/hibernate/hibernate_inverse_principle_analyse.html

27.Hibernate inverse属性的作用与原理分析

May 24, 2011 | tags  传智播客Hibernate3.2观看笔记   | views 825
Comments 0
这节视频内容是讲解 Hibernate inverse属性的作用与原理分析
     
         Employee emp1 = new Employee(); 
         emp1.setDepart(depart); 
         emp1.setName("emp name1"); 
   
         Employee emp2 = new Employee(); 
         emp2.setDepart(depart); 
         emp2.setName("emp name2"); 
 
         dept.setEmps(emps); 
         ...... 
         s.save(emp1); 
         s.save(emp2); 
         s.save(depart);

会产生一下sql语句:
   Hibernate:insert into Employee(name, dept_id) values(?,?)
   Hibernate:insert into Employee(name, dept_id) values(?,?)
   Hibernate:insert into Department(name) values(?)
   Hibernate:update Employee set name=? dept_id=? where id=?  //由emp1.setDepart(depart);产生
   Hibernate:update Employee set name=? dept_id=? where id=?  //由emp2.setDepart(depart);产生
   Hibernate:update Employee set dept_id=? where id=?         //由dept.setEmps(emps);产生
   Hibernate:update Employee set dept_id=? where id=?         //由dept.setEmps(emps);产生


有种方式可以让主对象dept放弃对子对象emp的关系的维护,通常会在的one一方放弃对多的关系的维护,这样效率会高起来(如老师记住每位学生是件困难的事情,效率是很低的,所以干脆就不记了,这关系由学生来维护,学生记住一位老师是很容易)。

<set name="emps" inverse="true">
    <key column="depart_id"/>
    <one-to-many class="Employee" />
</set>

    inverse表“是否放弃维护关联关系”(在Java里两个对象产生关联时,对数据库表的影响),在one-to-many和many-to-many的集合定义中使用,inverse="true"表示该对象不维护关联关系;该属性的值一般在使用有序集合时设置成false(注意hibernate的缺省值是false)。  one-to-many维护关联关系就是更新外键。many-to-many维护关联关系就是在中间表增减记录。
    注:配置成one-to-one的对象不维护关联关系

    设置成inverse="true",就算你告诉dept员工是谁, hibernate也不会管(dept.setEmps(emps);这句不起作用)

这样做还有个好处,如代码改成
    s.save(depart); 
    s.save(emp1); 
    s.save(emp2);

这样代码里就只有3条insert语句,那两条update语句就没了。 从效率上来讲,就好很多了,因为少了update语句。

    如果hbm.xml是inverse="false",java代码是
    s.save(depart); 
    s.save(emp1);     //因为先保存dept了,所以这时候dept_id已经有值了,所以少了它对应的update语句 
    s.save(emp2);

那么还是会有两条update语句,是:
    Hibernate:insert into Department(name) values(?)
    Hibernate:insert into Employee(name, dept_id) values(?,?)
    Hibernate:insert into Employee(name, dept_id) values(?,?)
    Hibernate:update Employee set dept_id=? where id=?   //因为dept属于持久态的,emp1,emp2保存后
    Hibernate:update Employee set dept_id=? where id=?   //相当于发生了变化,id有值了。持久态的对象,当他的属性发生了变化,那么hibernate会知道这种变化,会把这种变化反应到数据库里面去,反应到数据库的意思就是产生update语句。


如果hbm.xml是inverse="true",java代码是
    ....... 
    //emp1.setDept(dept); 
    //emp2.setDept(dept); 
    ......... 
    dept.setEmps(emps); 
    ........ 
    s.save(depart); 
    s.save(emp1);     //因为先保存dept了,所以这时候dept_id已经有值了,所以少了它对应的update语句 
    s.save(emp2);

运行后,会产生3条hibernate的insert语句,查询数据库,select * from employee;会发现 dept_id那一列都没有值。因为虽然告诉dept员工是谁(dept.setEmps(emps);),但是在配置里面inverse="true",告诉dept放弃维护关系了,所以它不会去更新外键的。

    所谓关系的维护,就是更新下外键


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值