hibernate做查询操作出现更新问题

/ 0条评论 / 0 个点赞 / 778人阅读

/upload/article/png/520520_20220506094616.png

出现问题:首先这段代码在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.

该属性不可变,因此不会更新。此时的不可变仅针对字段变更的自动行为