Hinernate关系维护

来源:互联网 发布:飞机杯推荐知乎 编辑:程序博客网 时间:2024/05/22 12:34

Hinernate关系维护
以员工(Employee)和部门(Department)为例说明:

上面的方法是添加员工操作,如果打印出sql语句会如下所示:
Hibernate: insert into Employee (name, depart_id) values (?, ?)
Hibernate: insert into Employee (name, depart_id) values (?, ?)
Hibernate: insert into Department (name) values (?)
Hibernate: update Employee set name=?, depart_id=? where id=?
Hibernate: update Employee set name=?, depart_id=? where id=?
Hibernate: update Employee set depart_id=? where id=?
Hibernate: update Employee set depart_id=? where id=?
分析以上sql语句可以呈现出Hibernate的操作流程:
第一步:先保存员工信息,这时候部门id为空
第二步:保存部门信息,这是产生了部门id,Hibernate中员工类(Employee)要维护与部门信息的关系
 就要更新员工信息,也就有了下面这两行sql语句:
 Hibernate: update Employee set name=?, depart_id=? where id=?
 Hibernate: update Employee set name=?, depart_id=? where id=?
第三部:另外部门也要维护与员工之间的关系,于是就产生了下面的sql语句了
 Hibernate: update Employee set depart_id=? where id=?
 Hibernate: update Employee set depart_id=? where id=?


====================================解决方案===================================
有一种方式可以让它放弃对这种关系的维护,一般在一对多的关系中让一的一方放弃对这种关系的维护,
这样效率就会高一些
 可以设置部门映射文件的员工属性映射的inverse属性,如下:
  

 inverse属性的意思是:‘是否要放弃维护关联关系?’ 设置为:true,就是不维护这种关系
 因此就不会产生一下sql语句:
 Hibernate: update Employee set name=?, depart_id=? where id=?
 Hibernate: update Employee set name=?, depart_id=? where id=?
 就提高了程序运行的效率.

通过以上步骤就省掉了两条upda语句,但是还有两条语句,后两句是如何产生的呢?
就是我们先保存了员工信息,这时部门id是没有值的,保存部门后就会产生更新语句,
因此只要先保存了部门,再保存员工就不会产生这些更新语句,从而节约了性能。

 


另外还有注意:inverse标签只能在集合中的属性中使用,比如:set,list,array,map等,在其他类型中
是没有这个属性的
并且inverse在有序的集合中也是不能使用的,比如List和Array等;它会放弃维护这种
序列化的关系

原创粉丝点击