Всегда ли @PreUpdate запускается при запуске @PrePersist? - PullRequest
0 голосов
/ 17 января 2019

У меня есть сущность, как показано ниже:

@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 голосов
/ 30 января 2019

Нет, @PreUpdate метод обратного вызова не всегда запускается при выполнении @PrePersist метода обратного вызова. @PrePersist выполняется до операции постоянства (прямой или каскадный) и @PreUpdate до обновления базы данных.

В спецификации JPA 2.1 (3.5.3 Семантика методов обратного вызова жизненного цикла для сущностей) это сказано следующими словами:

Методы обратного вызова PrePersist и PreRemove вызываются для данного сущность до того, как соответствующий EntityManager сохранится и удалится операции для этого объекта выполняются.
...
Предобновление и Обратные вызовы PostUpdate происходят до и после обновления базы данных операции с данными объекта соответственно.

...