使用Hibernate框架来更新对象的注意事项
Hibernate在更新对象的时候,如果对象的有些属性没有设置,那么在更新的时候,会被默认为空。
特别在更新表单对象的时候。
例子:
如: Department部门类
该部门类有以下属性:
id : Long
name : String (注:部门名称)
description : String (注:部门说明)
parent : Department (注:上级部门)
children : Set<Department> (注:下级部门)
修改页面表单: 除了children属性没有提供设置外,其他属性都有相应的输入框等进行设置(其中id是隐藏字段)。
![](https://images0.cnblogs.com/blog/709529/201506/082018115512556.png)
![](https://images0.cnblogs.com/blog/709529/201506/082018121131427.png)
那么该页面提交到的页面表单对象是只包含了id, name , description , parent 的实体,如果直接使用该对象进行更新的话,那么就会使得该对象修改之前的children属性为空。
也就是说,如果该“开发部门”对象,通过session.update(department)后,“开发部门”对象下的“研发组”,“编程组”等下级部门就变成了没有上级部门的部门。
如果需要只改变“开发部门”部门对象的name属性和description、parent属性,而不改变原有的“children”属性,那么,我们就要使用以下的方法来进行更新,而不是直接更新。
首先,通过页面表单传递过来的“开发部门”部门的id进行查找在数据库中的该持久化对象;
然后,通过给该持久化对象的name,description,parent 属性进行set()方法赋值;
最后,使用session.update()方法,更新该持久化对象,那么就会只更新了该持久化对象的name,description,parent属性。而不改变原有的children属性。
session更新对象的参考代码:
SessionFactory sessionFactory = new SessionFactory();
Session session = null;
try{
session = sessionFactory.openSession();
session.beginTranscation();
session.update(entity);
session.getTransaction().commit();
}catch(Exception e){
session.getTransaction().rollback();
}finally{
session.flush();
session.close();
}