DOES @PreUpdateは常に@PrePersistランを実行しますか?

アディツア・ナラヤンディキシット:

私は以下のようなエンティティを持っています:

@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チェックすると、私は、レコードのいずれかを見逃してしまう可能性があります。

ミッコMaunu:

いいえ、@PreUpdateときにコールバックメソッドが常に実行されない@PrePersistコールバックメソッドが実行されます。@PrePersist前に(直接またはカスケード)動作を持続して実行される@PreUpdateデータベースの更新前に。

JPA 2.1仕様(エンティティのためのライフ・サイクル・コールバック・メソッドのセマンティクス3.5.3)で、これは、次の言葉で語られています:

それぞれのEntityManagerが持続し、そのエンティティの削除操作が実行される前PrePersistとは、preremoveコールバックメソッドは、特定のエンティティのために呼び出されます。
...
更新前とPostUpdateコールバックは、それぞれエンティティデータへのデータベースの更新操作の前と後に発生します。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=215300&siteId=1