【问题标题】:Why @PreUpdate run in every query in JPA?为什么@PreUpdate 在 JPA 的每个查询中运行?
【发布时间】:2020-07-02 11:06:59
【问题描述】:

我在Spring项目的实体类中使用@PreUpdate注解如下:

@Entity
public class Room {
   @Id
   @GeneratedValue
   private Long id;
   
   // Other fields and Getters and Setters

   @PreUpdate
   public void preUpdate(){
         System.out.println("pre Update");
   }
}

现在在每个查询中,preUpdate 方法被调用,甚至查询到另一个实体。这个逻辑是否正确?我觉得有点不合逻辑。

【问题讨论】:

    标签: java hibernate jpa spring-data-jpa


    【解决方案1】:

    查询触发一级缓存的刷新。 这反过来会触发对被认为是脏的实体的preUpdate 的调用,即需要刷新。

    flush 的原因是 JPA 无法真正判断实体的更改状态如何影响查询结果。

    因此,例如,如果您有一个加载一堆实体的过程,然后根据一些额外的查询逐个更改它们,您基本上是在编辑和查询之间交替并导致刷新,因此调用preUpdate 所有时间。

    据我们所知,这似乎完全符合预期。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-21
      • 1970-01-01
      • 2011-10-18
      • 2014-05-31
      • 2011-10-21
      相关资源
      最近更新 更多