EntityLIstener не вызывается через сопоставление OneToOne с каскадом

У меня есть объект приложения и некоторые объекты формы. Каждый раз, когда форма сохраняется, я хотел бы обновить Application.lastUpdated. Приложение имеет EntityListener, который я хочу использовать для установки Application.lastUpdated для меня.

Когда я сохраняю приложение, вызывается EntityListener, и он работает. Однако, когда я сохраняю форму, EntityListener не вызывается. Я вижу это по отладке и по тому факту, что поле lastUpdated не меняется. Форма имеет одностороннюю связь OneToOne с Приложением с CascadeType.ALL.

Могу ли я заставить эту установку работать? Если нет, есть ли лучший способ сделать это, чем вручную обновлять Application.lastUpdated каждый раз, когда я сохраняю форму?

Я использую JPA при поддержке Hibernate и HSQLDB. Все аннотации JPA.

Вот определение связи формы

@Entity
public class CourseForm implements Serializable {

  private static final long serialVersionUID = -5670525023079034136L;

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  long id;

  @OneToOne(cascade = CascadeType.ALL)
  @JoinColumn(name = "application_fk")
  private Application application;
  //more fields
  //getters and setters
}

Приложение выглядит следующим образом:

@Entity
@EntityListeners({ LastUpdateListener.class })

public class Application implements Serializable {

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  long id;

  private LocalDateTime lastUpdate;


  //more fields

  Application() {
  }

  public LocalDateTime getLastUpdate() {
    return lastUpdate;
  }

  public void setLastUpdate(LocalDateTime lastUpdate) {
    this.lastUpdate = lastUpdate;
  }
  //getters and setters
}

Вот слушатель

public class LastUpdateListener {
@PreUpdate
@PrePersist
public void setLastUpdate(Application application) {
    application.setLastUpdate(LocalDateTime.now());
}

person Mark Chorley    schedule 23.05.2013    source источник


Ответы (1)


Я подозреваю, что приведенная выше настройка не работает, потому что объект Application фактически не изменяется, поэтому @prePersist и @PreUpdate не вызываются.

Я решил проблему, заставив каждую форму реализовать интерфейс MasterForm:

public interface MasterForm {
    Application getApplication();
}

Затем я переместил EntityListener на каждую форму и обновил приложение напрямую следующим образом:

public class LastUpdateListener {
@PreUpdate
@PrePersist
public void setLastUpdate(MasterForm form) {
    form.getApplication().setLastUpdate(LocalDateTime.now());
}

Это работает, как и ожидалось.

person Mark Chorley    schedule 24.05.2013