7

私はかなり長い間 @PrePersist を使用する JPA @Entity クラスを持っています。今日は、そのエンティティの 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()");
    }
}

Java v7+、Hibernate v3.3.1.GA、および Seam v2.2.2.Final を備えた JBoss v4.2 環境を使用しています...

@PostPersist が起動するための隠れた要件はありますか?

4

2 に答える 2

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" />

これらはもう使用していません... 完全に無効になったことはありません。

于 2013-02-28T14:18:54.990 に答える
0

コミットまたはフラッシュ中に呼び出されると思います。これらのいずれかを明示的に呼び出していますか? 私が疑問に思っているのは、エンティティ マネージャーが実際にデータベースに永続化されてから、多少の遅延が発生する可能性があることです。たとえば、トランザクションは、応答が (Web アプリで) 書き込まれるまでコミットされない場合があります。

また、ロガーを使用してみてください。Web アプリから標準出力を呼び出すと、奇妙なことが起こる可能性があります。

于 2013-02-28T14:15:08.633 に答える