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

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

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

java JPA 更新字段返回影响行数,但是数据未更新问题_第1张图片
在这里插入图片描述

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

修改如下:

在这里插入图片描述

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

官方的解释如下:

java JPA 更新字段返回影响行数,但是数据未更新问题_第2张图片

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

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

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

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

你可能感兴趣的:(java)