奇怪的是,只有在我使用注释定义它们时才会调用“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中的上述声明似乎是正确的。
我不知道在哪里挖掘这个问题。
我在SE环境中使用带有H2的EclipseLink 2.2.0。
更新
感谢您的回答。日志/控制台中没有错误可以查看。事件似乎被忽略了。
您认为可能是一个错误,因为将方法和XML声明从超类移动到子类可以解决问题。对我来说这不是一个理想的解决方案,因为我希望为所有实体提供全局解决方案,但让我前进了一步。
我已将错误报告发送给EclipseLink人员:)
正如你所说,我尝试过实体监听器,它对我有用。所以我会坚持这个解决方案。它甚至看起来比具有基本实体类的解决方案更好;)
谢谢!
答案 0 :(得分:1)
您的XML看起来是正确的。日志中是否发生任何错误?
可能是MappedSuperClass和实体事件的错误。 你能尝试在子类上设置事件并查看它是否有效吗? 如果是,那么它可能是一个错误,请在Eclipse Bugzilla中记录错误。
另一种解决方法是使用实体监听器。