2017-01-09 4 views
1

私はHibernateを使用するプロジェクトを持っています。永続性パッケージにマップされた(注釈付きの)すべてのオブジェクトは、変更された場合、トランザクションメソッドの最後に自動的に更新されます。JPAの一括更新がTransactionalEventListenerをトリガーしますか?

JPA 2.1からCriteraUpdateで一括更新したいのですが、私はSpringからTransactionalEventListenersをトリガーするようにオブジェクトを変更する必要があります。 JPAを使用していてもオブジェクトを変更して保存メソッドを呼び出さないと、各オブジェクトが保持されます。

また、TransactionalEventListenerがHibernateの代わりにJPAライフサイクルで動作するかどうかはわかりません(私はApplicationEventPublisherAwareインターフェイスを実装しています)。

+0

リスナークラスと同様にトランザクションメソッドをアタッチできますか?また、どのバージョンのSpringを使用していますか? –

答えて

1

orm操作のJPAメソッドを使用している場合は、EntityManagerインターフェイスを使用していることが予想されます。

これは、実装(Hibernate Sessionクラス)ではなく、APIとやりとりしているので、良いアプローチです。 EntityManagerは、セッションクラスを呼び出していて、デコレータのように動作するため、Hibernateはすべての作業を行っています。

SpringのトランザクションBeanがHibernateのSessionFactoryで動作するように適切に設定されている場合、リスナーはイベントをキャッチする必要があります。

私が考えることができるのは、バルク操作をトリガすると、JPAのPersistenceContextは、単一のエンティティdml操作とクエリではなく、省略されているということだけです。すべてがトランザクションの回りにラップされているので、リスナーを呼び出す必要があります。

念のために、仕様が存在していない取引の場合に示唆するよう@TransactionalEventListenerにこのフラグを配置します。

イベントは管理のトランザクションの境界内で公開されていない場合

、イベントfallbackExecution()フラグが明示的に設定されていない限り、破棄されます。

関連する問題