来源: 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属性的作用与原理分析
会产生一下sql语句:
有种方式可以让主对象dept放弃对子对象emp的关系的维护,通常会在的one一方放弃对多的关系的维护,这样效率会高起来(如老师记住每位学生是件困难的事情,效率是很低的,所以干脆就不记了,这关系由学生来维护,学生记住一位老师是很容易)。
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);这句不起作用)
这样做还有个好处,如代码改成
这样代码里就只有3条insert语句,那两条update语句就没了。 从效率上来讲,就好很多了,因为少了update语句。
如果hbm.xml是inverse="false",java代码是
那么还是会有两条update语句,是:
如果hbm.xml是inverse="true",java代码是
运行后,会产生3条hibernate的insert语句,查询数据库,select * from employee;会发现 dept_id那一列都没有值。因为虽然告诉dept员工是谁(dept.setEmps(emps);),但是在配置里面inverse="true",告诉dept放弃维护关系了,所以它不会去更新外键的。
所谓关系的维护,就是更新下外键
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放弃维护关系了,所以它不会去更新外键的。
所谓关系的维护,就是更新下外键