Разрешает ли JPA PrePersist / PreUpdate для встроенных классов в MappedSuperclass? - PullRequest
0 голосов
/ 28 июня 2019

У меня есть @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 это разрешено?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...