今天遇到一个离奇的bug,问题如下: 用jpa更新数据库中的两个字段,通过debug确认更新字段都成功传入,并且返回影响行数为1,但是数据库中的字段确未更新。改方法在service中有两处调用,其中一个可以正常更新,但是另一个却出现上述问题,令我十分困解。。。 后来在网上查找类似问题的解决方法,得以完美解决: 修改如下: 只是设置了@Modifying(clearAutomatically = true),那么该注解的作用是什么? 官方的解释如下: 文章大意:如果修改查询更改持久性上下文中包含的实体,则此上下文将过期。管理这种情况的一种方法是清除持久性上下文。通过这样做,我们可以确保持久性上下文下次将从数据库获取实体。但是,我们不必显式地调用EntityManager上的clear)方法。我们可以只使用来自@ modify注释的clearautomatic属性:修改(自动清除=正确)这样,我们可以确保在执行查询之后清除持久性上下文。 也就是说该注解可以清除底层持久化上下文,就是entityManager这个类,我们知道jpa底层实现会有二级缓存,也就是在更新完数据库后,如果后面去用这个对象,你再去查这个对象,这个对象是在一级缓存,但是并没有跟数据库同步,这个时候用clearAutomatically=true,就会刷新hibernate的一级缓存了, 不然你在同一接口中,更新一个对象,接着查询这个对象,那么你查出来的这个对象还是之前的没有更新之前的状态。 ****************** 追加:后期维护该段代码,发现再次出现了同样的问题,加上@ modify注释的clearautomatic属性也未解决,最终将update的sql换成了save才得以解决,但问题原因没有找到,初步判断可能和事务有关。。。。。。