出现问题:首先这段代码在action层,查询出RsLeave类后修改这个类的type属性(红色箭头所示),后面继续进行RsLeave关联类的查询(绿色箭头所示),程序运行后发现数据库中当前RsLeave中type值已经被修改,因此推出虽然表面进行只是查询,但其实内部也发生了更新操作。
解决办法:
1:把修改type属性的操作放到所有查询操作后
2:在事物层的查询方法中添加事物为只读(@Transactional(readOnly=true))
问题分析:hibernate在做查询操作的时候会去查找session中当前类的属性值与关联类的属性值是否发生改变,如果发生改变则会进行更新操作。
Hibernate查询出的实体都是持久化对象,如果调用该对象的set方法,那么在事务递交时,Hibernate会把你设置的值自动更新到数据库中。
解决方案一
查询方法添加@Transactional(readOnly = true) 事务设置为只读属性
解决方案二
查询方法添加 @Transactional(propagation = Propagation.NOT_SUPPORTED)不在事务中运行
解决方案三
如果是表关联字段,可以在注解中添加属性updatable = false
例:
@JoinColumn(updatable = false)
此时,当事务递交,进行数据更新时
例:
控制台打印如下
The [engineKeyPair] property of the [cn.unitid.flame.gateway.gmssl.certificate.entity.Certificate] entity was modified, but it won't be updated because the property is immutable.
该属性不可变,因此不会更新。此时的不可变仅针对字段变更的自动行为
本文由 admin 创作,采用 知识共享署名4.0
国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为:2022-11-07 19:51:43