@PrePersist运行时,@ PreUpdate是否总是运行吗?

时间:2019-01-17 07:56:22

标签: java jpa spring-data-jpa spring-data jpql

我有一个如下实体:

@Entity
public class Order {

  @Id
  private String orderId;

  @Temporal(TemporalType.TIMESTAMP)
  @Column(name = "created_at", nullable = false)
  private Date created;

  @Temporal(TemporalType.TIMESTAMP)
  @Column(name = "updated_at", nullable = false)
  private Date updated;
  @PrePersist
  protected void onCreate() {
    this.created = new Date();
    this.updated = this.created;
  }

  @PreUpdate
  protected void onUpdate() {
    this.updated = new Date();
  }
}

我必须找到在特定日期范围内创建或更新日期的所有订单。为此,我在存储库中定义了以下方法:

public interface OrderRepository extends PagingAndSortingRepository<Order, String>,
    QuerydslPredicateExecutor<Order> {
 public Page<Order> findByCreatedBetweenOrUpdatedBetween(Date startCreatedDate,
      Date endCreatedDate, Date startUpdatedDate, Date endUptedDate, Pageable pageRequest);
}

我的问题是,我可以只检查Updated_date而不是像下面这样创建和更新日期吗?

public Page<Order> findByUpdatedBetween(Date startUpdatedDate, Date endUptedDate, Pageable pageRequest);

我观察到的是updated_date在插入行时与created_date相同的值被更新。如果仅检查updated_date提供的日期范围,是否有机会错过任何记录。

1 个答案:

答案 0 :(得分:1)

否,执行@PreUpdate回调方法时,@PrePersist回调方法并不总是运行。 @PrePersist在持久操作(直接或级联)之前执行,@PreUpdate在数据库更新之前执行。

在JPA 2.1规范(3.5.3实体的生命周期回调方法的语义)中,这是用以下词语来表示的:

  

为给定调用PrePersist和PreRemove回调方法   实体在各自的EntityManager持久存在并移除之前   该实体的操作已执行。
  ...
  PreUpdate和   PostUpdate回调发生在数据库更新之前和之后   分别对实体数据进行操作。