Hibernate自动更新的坑
问题描述:
昨天有个同学遇到一个问题,跑来问我,hibernate查询出来的对象集合,根据业务需要遍历赋值,结果赋值的对象都会更新到数据库...好吧,这明显是有问题的.
问题追踪:
1.查看日志后发现,系统总是会打印出一个update语句。说明系统的确是执行了更新操作的,但是我并没有调用任何和update相关的方法。
2.通过hibernate中hql查询出的实体都是持久化对象,拿到该对象后,如果你调用了该对象的set方法,那么在事务递交的时候,Hibernate会把你设置的值自动更新到数据库中。
问题处理:
1.通过getCurrentSession().clear();强制清除Session缓存,但是他的业务中又需要懒加载去获取关联的实体,这样导致调用的clear无效。
2.所以采用了getCurrentSession().evict(entity),懒加载获取的实体后,通过调用evict(entity)的方法,把缓存持久化对象变成托管状态。变成托管状态后,Hibernate就不会再去自动更新该实体。
拓展:
Hibernate的实体状态:
https://blog.csdn.net/sunhuwh/article/details/9183539