JPA <pre-persist> <pre-update>被忽略但@PrePersist和@PreUpdate工作正常</pre-update> </pre-persist>

时间:2011-06-01 13:35:52

标签: orm jpa eclipselink

我遇到了一个奇怪的问题。我有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中的上述声明似乎是正确的。

我不知道在哪里挖掘这个问题。

我在SE环境中使用带有H2的EclipseLink 2.2.0。


更新

感谢您的回答。日志/控制台中没有错误可以查看。事件似乎被忽略了。

您认为可能是一个错误,因为将方法和XML声明从超类移动到子类可以解决问题。对我来说这不是一个理想的解决方案,因为我希望为所有实体提供全局解决方案,但让我前进了一步。

我已将错误报告发送给EclipseLink人员:)

正如你所说,我尝试过实体监听器,它对我有用。所以我会坚持这个解决方案。它甚至看起来比具有基本实体类的解决方案更好;)

谢谢!

1 个答案:

答案 0 :(得分:1)

您的XML看起来是正确的。日志中是否发生任何错误?

可能是MappedSuperClass和实体事件的错误。 你能尝试在子类上设置事件并查看它是否有效吗? 如果是,那么它可能是一个错误,请在Eclipse Bugzilla中记录错误。

另一种解决方法是使用实​​体监听器。