Я столкнулся со странной проблемой. У меня есть целая модель домена, определенная в файле orm.xml. Все мои сущности в моем проекте - просто простые POJO (вообще никаких аннотаций jpa). Я хочу сохранить последнее обновление и временные метки вставки моих сущностей, и я решил использовать «pre persist» и «pre update», как и большинство из нас. Итак, я определил базовый класс сущностей и позволил всем своим сущностям расширять его.
Странно, что pre-persist (и все остальные события) вызываются только тогда, когда я определяю их с помощью аннотаций. Когда я определяю их в файле orm.xml - ничего не происходит, они просто игнорируются.
Это работает для меня:
public abstract class BaseEntity {
private Timestamp insertTimestamp;
private Timestamp lastUpdateTimestamp;
@PrePersist
public void onPersist() {
...
}
@PreUpdate
public void onUpdate() {
...
}
}
Но после удаления аннотаций и перехода на xml ничего не работает:
<mapped-superclass class="com.my.model.BaseEntity">
<pre-persist method-name="onPersist"/>
<pre-update method-name="onUpdate"/>
<post-load method-name="postLoad"/>
</mapped-superclass>
В соответствии со спецификацией JPA приведенные выше декларации в xml выглядят правильными.
Понятия не имею, где искать проблему.
Я использую EclipseLink 2.2.0 с H2 в среде SE.
UPDATE:
Спасибо за ваш ответ. Там нет ошибок в журнале / консоли, чтобы увидеть. Кажется, что события просто игнорируются.
Как вы и думали, это может быть ошибкой, поскольку перемещение методов и объявлений XML из суперкласса в подкласс решает проблему. Для меня это не желаемое решение, так как я хочу иметь глобальное решение для всех организаций, но продвинуло меня немного вперед.
Я отправил отчет об ошибке ребятам из EclipseLink:)
Как вы и предполагали, я пробовал с прослушивателем сущностей, и это работает для меня. поэтому я буду придерживаться этого решения. Это даже выглядит лучше, чем решение с базовым классом сущности;)
Спасибо!