【问题标题】:@PostPersist not called... @PrePersist is... why?@PostPersist 没有被调用...... @PrePersist 是......为什么?
【发布时间】:2013-02-14 18:08:06
【问题描述】:

我有一个 JPA @Entity 类,它使用 @PrePersist 已经有一段时间了。今天我想在需要该实体 ID 的地方添加一些功能。此 ID 在持久化期间由数据库中的 HIBERNATE_SEQUENCE 生成。它通常设置在 em.persist(entity) 之后。

由于某些未知原因,触发了 @PrePersist 方法...而 @PostPersist 根本不会触发:

@Entity
public class MyEntity {

    @PrePersist
    protected void onCreate() {
        System.out.println("ExtendedEntity.onCreate()");
    }

    @PostPersist
    protected void afterCreate() {
        System.out.println("ExtendedEntity.afterCreate()");
    }
}

我正在使用 JBoss v4.2 环境和 Java v7+、Hibernate v3.3.1.GA 和 Seam v2.2.2.Final...

@PostPersist 要触发有什么隐藏的要求吗?

【问题讨论】:

  • 大声思考... org.hibernate.event.PostInsertEventListener 会干扰 JPA 吗?
  • 它确实会干扰...看我的回答。

标签: java hibernate jpa


【解决方案1】:

对于其他所有人... Hibernate 事件侦听器似乎会干扰 JPA 持久性事件...从我的 persistence.xml 中删除以下行后,@PostPersist 回调被触发。

<property name="hibernate.ejb.event.pre-insert"  value="my.hibernate.events.listeners.Listener" />
<property name="hibernate.ejb.event.pre-update"  value="my.hibernate.events.listeners.Listener" />
<property name="hibernate.ejb.event.pre-delete"  value="my.hibernate.events.listeners.Listener" />
<property name="hibernate.ejb.event.post-insert" value="my.hibernate.events.listeners.Listener" />
<property name="hibernate.ejb.event.post-update" value="my.hibernate.events.listeners.Listener" />
<property name="hibernate.ejb.event.post-delete" value="my.hibernate.events.listeners.Listener" />

我们甚至不再使用这些...它们只是从未被完全禁用。

【讨论】:

  • 对于后代来说,这是因为 Hibernate 实际上是通过其侦听器实现其 JPA 回调。因此,与其重写侦听器,不如确保添加侦听器;这样两者就可以共存(每种类型的侦听器堆叠在一起)。
  • 所以我的设置禁用了 Hibernate 自己用于 JPA 回调的侦听器?请记住... @PrePersist 仍然使用上述条目。无论我是否使用这些设置,JPA 回调都应该起作用。
  • 也许吧。不反对。只是解释发生了什么。我们对允许 JPA 回调和 Hibernate 事件侦听器一起工作的增强请求为零。但尽管如此,他们实际上可以,只是不使用这种基于 XML 的侦听器配置方式(无论如何现在都已弃用)。
【解决方案2】:

我相信它会在提交或刷新期间被调用。您是否明确调用其中任何一个?我想知道的是,从实体管理器实际持久化到数据库时可能会有一些延迟。例如,在响应被写入(在网络应用程序中)之前,事务可能不会被提交。

另外,尝试使用记录器,从网络应用调用标准输出时可能会发生奇怪的事情。

【讨论】:

  • STDOUT 只是暂时的......我正常使用 Log4J。手动 flush() 没有改变任何东西......请参阅我的答案。
  • 很好...您没有提到您在问题中设置了休眠事件侦听器。
  • 也没想到这些……好久没用了,只配置了一个简单的logger类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多