5

エンティティ オブジェクトを永続化するメソッド persistData() があります。永続化された主キー値の同じエンティティ クラスで find() 操作を実行する別のメソッド findData() があります。エンティティ クラスの @PostPersist で findData() を呼び出すと、null ポインター例外が発生します。これにより、私の心にいくつかの疑問が生じました。

  1. ヌル ポインター エラーが発生するのはなぜですか?
  2. @PostPersist の実際の用途は何ですか?
  3. @Postpersist が実際に呼び出されるのはいつですか? コミット後、コミット中、またはコミット前?

さらなる洞察もいただければ幸いです。以下の関連するコードとスタックトレースを見つけてください。

public void persistData(){
        EntityManagerFactory fac= Persistence.createEntityManagerFactory("test");
        EntityManager man = fac.createEntityManager();

        Employee e = new Employee();
        e.setEmpId(500);
        e.setEmpName("Emp5");
        e.setSalary(5000);
        man.getTransaction().begin();
        man.persist(e);
        man.getTransaction().commit();
        man.close();

    }



public void findData(){
        EntityManagerFactory fac= Persistence.createEntityManagerFactory("test");
        EntityManager man = fac.createEntityManager();

        Employee e=man.find(Employee.class, 500);
        System.out.println(e.getEmpName());
        man.close();    
    }

@PostPersist
public void getData(){
    new Service().findData();
}

スタック トレース (部分):

Exception in thread "main" javax.persistence.RollbackException: java.lang.NullPointerException
    at oracle.toplink.essentials.internal.ejb.cmp3.transaction.base.EntityTransactionImpl.commit(EntityTransactionImpl.java:120)
    at oracle.toplink.essentials.internal.ejb.cmp3.transaction.EntityTransactionImpl.commit(EntityTransactionImpl.java:60)
    at Service.persistData(Service.java:18)
    at Service.main(Service.java:34)
Caused by: java.lang.NullPointerException
    at Service.findData(Service.java:28)
    at Employee.getData(Employee.java:33)

:JPA 1.0を使用しています

4

2 に答える 2

5

質問 1 に答えるには:

(コードとスタックトレースが必要です)

質問 2 に答えるには:

@PostPersist は、JPA コールバック メソッドを示します。これにより、エンティティ ライフサイクル イベントを通じていくつかのコードをトリガーできます。

実例?

User テーブルがあり、新しい User が永続化されるたびに確認メールを生成したいとします。これはPostPersistメソッドで実行できます。

質問 3 に答えるには:

仕様の関連部分は血液型です。

JPA-2.0仕様から:

PostPersist および PostRemove コールバック メソッドは、エンティティが永続化または削除された後にエンティティに対して呼び出されます。これらのコールバックは、これらの操作がカスケードされるすべてのエンティティでも呼び出されます。PostPersist メソッドと PostRemove メソッドは、それぞれデータベースの挿入操作と削除操作の後に呼び出されます。これらのデータベース操作は、persist、merge、または remove 操作が呼び出された直後に発生するか、フラッシュ操作が発生した直後に発生する可能性があります (トランザクションの最後に発生する場合があります)。生成された主キー値は、PostPersist メソッドで使用できます。

于 2013-03-29T12:46:47.063 に答える