9

PostDeleteEventListener, PostInsertEventListener, PostUpdateEventListener挿入、削除、更新中にいくつかの操作を行うために、Hibernate イベントリスナーを使用していました。Hibernate から他の JPA プロバイダーに移動したい場合は、リスナーが機能するはずなので、JPA リスナーを使用してこれを行いたいと思います。Hibernateリスナーはevent、そこからトランザクションを取得し、コミットされているかロールバックしているかを確認できるようにします。JPAリスナーはエンティティオブジェクトのみを提供します。JPAリスナーでトランザクションまたはセッションまたはエンティティマネージャーを取得するにはどうすればよいですか?? 前もって感謝します!!Jboss を CMT として使用しています。

4

3 に答える 3

7

これは、JPA 2.0 の時点ではサポートされていません。

JPA 2.1 (Java EE 7 に含まれる予定) では、持続性プロバイダーは、マネージド環境 (JBoss アプリケーション サーバーなど) ではエンティティ リスナーを CDI Bean として扱います。JPA 2.1仕様の提案された最終ドラフトから、96ページ:

Java EE 環境のエンティティ リスナー クラスは、含まれているアーカイブが Bean アーカイブである場合、Contexts and Dependency Injection API (CDI) [10] を介した依存性注入をサポートします。CDI インジェクションを利用するエンティティ リスナー クラスは、PostConstruct および PreDestroy アノテーションでアノテーションが付けられたライフサイクル コールバック メソッドを定義することもできます。これらのメソッドは、注入が行われた後、エンティティ リスナー インスタンスが破棄される前にそれぞれ呼び出されます。

したがって、JPA 2.1 では、EntityManager を提供する CDI プロデューサーを作成する場合 (@PersistenceContext フィールドに @Produces でアノテーションを付けるだけで)、単に EntityManager をリスナーに @Inject できます。

その間、私はクリーンで快適な回避策を知りません。私が考えることができる「最も悪い」ことは、EntityManagerをJNDIにバインドするように構成し、リスナー内からJNDIルックアップを介して取得することです。

于 2013-02-25T23:26:40.613 に答える
-3

次の 2 つの方法を使用して、JPA ですべてのプリ/ポスト ロード、挿入、更新、または削除リスナーを使用できます。

  1. アノテーションを使用する。Listener を使用する簡単な例は、エンティティが永続化、更新、またはロードされた後にデータを入力する必要がある一時変数を持つ場合です。たとえば、次のようになります。

    public class AvailableCreditListener {
        @PostLoad
        @PostPersist
        @PostUpdate
        public void calculateAvailableCredit(Account account) {
            account.setAvailableCredit(
                account.getBalance().add(
                account.getOverdraftLimit()));
        }
    }
    

    エンティティ クラスには @EntityListeners のアノテーションが付けられます。

    @EntityListeners({AvailableCreditListener.class})
    public class Account extends BaseEntity {
        private BigDecimal balance;
        private BigDecimal overdraftLimit;
        @Transient
        private BigDecimal availableCredit;
        // getters and setters
    }
    
  2. persistence.xml 構成ファイルを使用する。

最後に、注釈の代わりに、XML マッピング ファイルを使用してアプリケーションと共にデプロイし、デフォルトのリスナーを指定できます。(このマッピング・ファイルは、persistence.xml ファイルによって参照されます。)ただし、デフォルトのリスナーを使用したくない場合、エンティティーは @ExcludeDefaultListeners アノテーションを使用できます。

@ExcludeDefaultListeners
@Entity
public class Account extends BaseEntity {
    ....
}

persistence.xml で:

<persistence-unit-metadata>
    <persistence-unit-defaults>
      <entity-listeners>
        <entity-listener class="samples.AvailableCreditListener"/>      
      </entity-listeners>
    </persistence-unit-defaults>
  </persistence-unit-metadata>
于 2012-11-06T12:57:38.947 に答える