У меня есть @MappedSuperclass
, который содержит @Embedded
элемент.Без использования @MappedSuperclass
@PrePersist
и @PreUpdate
выполняются, как и ожидалось.
@MappedSuperclass
public abstract class BaseLocalizedString implements Serializable {
@Embedded
private final Audit audit = new Audit();
}
Поэтому мой обходной путь - добавить @PrePersist
и @PreUpdate
/**
* Workaround since the Embedded PrePersist does not get called.
*/
@PrePersist
public void created() {
audit.setCreatedBy(AuditContext.getUserID());
audit.setCreatedByName(AuditContext.getUserFullName());
audit.setCreatedOn(ZonedDateTime.now());
audit.setLastUpdatedBy(AuditContext.getUserID());
audit.setLastUpdatedByName(AuditContext.getUserFullName());
audit.setLastUpdatedOn(ZonedDateTime.now());
}
/**
* Workaround since the Embedded PreUpdate does not get called.
*/
@PreUpdate
public void updated() {
audit.setLastUpdatedBy(AuditContext.getUserID());
audit.setLastUpdatedByName(AuditContext.getUserFullName());
audit.setLastUpdatedOn(ZonedDateTime.now());
}
Аудит
@Embeddable
@Data
public class Audit implements Serializable {
@Column(updatable = false, nullable = false)
private String createdBy;
@Column(updatable = false, nullable = false)
private String createdByName;
@Column(updatable = false, nullable = false)
private ZonedDateTime createdOn;
@Column(nullable = false)
private String lastUpdatedBy;
@Column(nullable = false)
private String lastUpdatedByName;
@Column(nullable = false)
private ZonedDateTime lastUpdatedOn;
@PrePersist
public void created() {
lastUpdatedBy = createdBy = AuditContext.getUserID();
lastUpdatedByName = createdByName = AuditContext.getUserFullName();
lastUpdatedOn = createdOn = ZonedDateTime.now();
}
@PreUpdate
public void updated() {
lastUpdatedBy = AuditContext.getUserID();
lastUpdatedByName = AuditContext.getUserFullName();
lastUpdatedOn = ZonedDateTime.now();
}
}
В Hibernate я обнаружил, что он не разрешает PrePersist / PreUpdate для встроенных классов в MappedSuperclass.Мой вопрос: в спецификации JPA это разрешено?