java JPA 更新字段返回影响行数,但是数据未更新问题

今天遇到一个离奇的bug,问题如下:

用jpa更新数据库中的两个字段,通过debug确认更新字段都成功传入,并且返回影响行数为1,但是数据库中的字段确未更新。改方法在service中有两处调用,其中一个可以正常更新,但是另一个却出现上述问题,令我十分困解。。。

在这里插入图片描述
在这里插入图片描述

后来在网上查找类似问题的解决方法,得以完美解决:

修改如下:

在这里插入图片描述

只是设置了@Modifying(clearAutomatically = true),那么该注解的作用是什么?

官方的解释如下:

在这里插入图片描述

文章大意:如果修改查询更改持久性上下文中包含的实体,则此上下文将过期。管理这种情况的一种方法是清除持久性上下文。通过这样做,我们可以确保持久性上下文下次将从数据库获取实体。但是,我们不必显式地调用EntityManager上的clear)方法。我们可以只使用来自@ modify注释的clearautomatic属性:修改(自动清除=正确)这样,我们可以确保在执行查询之后清除持久性上下文。

也就是说该注解可以清除底层持久化上下文,就是entityManager这个类,我们知道jpa底层实现会有二级缓存,也就是在更新完数据库后,如果后面去用这个对象,你再去查这个对象,这个对象是在一级缓存,但是并没有跟数据库同步,这个时候用clearAutomatically=true,就会刷新hibernate的一级缓存了, 不然你在同一接口中,更新一个对象,接着查询这个对象,那么你查出来的这个对象还是之前的没有更新之前的状态。

******************

追加:后期维护该段代码,发现再次出现了同样的问题,加上@ modify注释的clearautomatic属性也未解决,最终将update的sql换成了save才得以解决,但问题原因没有找到,初步判断可能和事务有关。。。。。。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值