在项目中遇到的记录一下
大致场景伪代码如下:
//查询到对象user
User user = session.get(User.class,1);
//根据user的属性gender(存的是code)查出对应的name
Gender gender = session.creatQuery("form Gender where code = '"+a.getGender()+"'").list().get(0);
String gen_name = gender.getName();
//将查到的属性设置回去user中
user.setGender(gen_name);
......
最后发现user对象的gender属性被更新成了gender的name,查看控制台发现发出了update语句,然后并没有调用
session.update(user);
方法。
网络搜索问题发现hibernate会在事务提交,因为当我们执行get方法的时候,其实在内存中,session缓存中,数据库中都有对应的User对象。而当我们改变其内存中对象的名字的时候。我们再提交的话,其实是数据库事务会去检测,内存中的session对象的值和缓存session中的值是否一致,不一致的话,那么则提交更新。
session.getTransaction().commit();
的时候提交含有更新的内容(spring 管理事务自动提交也会造成同样的问题)。
解决办法:对有属性设置但是不想提交更新的对象使用
session.evict(Object object);//从session缓存中逐出指定对象
然后上面的代码就这样写就不会造成非预想的更新了
//查询到对象user
User user = session.get(User.class,1);
session.evict(user);//从session缓存中逐出user对象
//根据user的属性gender(存的是code)查出对应的name
Gender gender = session.creatQuery("form Gender where code = '"+a.getGender()+"'").list().get(0);
String gen_name = gender.getName();
//将查到的属性设置回去user中
user.setGender(gen_name);
......
也许还有别的更好的解决办法,暂时没有精力深究。