@PostPersist没有叫... @PrePersist是......为什么?

时间:2013-02-28 14:02:10

标签: java hibernate jpa

我有一个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是否有隐藏的要求?

2 个答案:

答案 0 :(得分:8)

对于其他所有人...... 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" />

我们甚至不再使用它们......它们从未被完全禁用过。

答案 1 :(得分:0)

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

另外,尝试使用记录器,从Web应用程序调用标准输出时会发生奇怪的事情。