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