私は、Hibernate 4.3.7からHibernate 5.0.7へのJTAトランザクションと非同期永続コンテキストを使用するアプリケーションを移行しようとしています。私の周りに頭を上げることはできません。私たちのエンティティマネージャーとして注入Hibernate 5.xとWildlfyでUSYNCHRONIZED永続コンテキストを使用
@PersistenceContext(type = PersistenceContextType.EXTENDED, synchronization = SynchronizationType.UNSYNCHRONIZED)
private EntityManager entityManager;
私は、拡張された非同期永続コンテキストを持つことを期待しています。アプリケーションでは、UNSYNCHRONIZED機能を使用して、必要になるまでエンティティのデータベースへの変更をフラッシングしないようにします。通常、save/persist/remove操作の後にのみ変更をフラッシュし、これらのメソッドはentityManager.joinTransaction();
を呼び出して、現在のトランザクションを明示的に同期にマークします。これはHibernate 4.3.7ではある程度は動作しますが、バージョン5では停止しました。
バージョン5の場合、Hiberanteの人は特にトランザクション処理領域でかなりの書き換えを行いました。私の理解から、休止状態はsession.autoJoinTransactionsフラグを使用してUNSYNCHRONIZED機能を実装します。セッションがトランザクションに参加しない限り、セッションはフラッシュされません(デフォルトのflushMode.AUTOが使用されます)。我々はJTAは、それが動作するために使用するトランザクションを管理し使用以前に、このフラグは
sessionBuilder.autoJoinTransactions(getTransactionType() != PersistenceUnitTransactionType.JTA);
と休止状態5(EntityManagetImpl線132)で
sessionBuilder.autoJoinTransactions(getSynchronizationType() == SynchronizationType.SYNCHRONIZED);
として新しいセッションに設定されます。しかし今はそうではありません。 SynchronizationTypeに基づいてautoJoinTransaction
フラグの値を決定するのは正しいことですが、小さな問題が1つあります。 persistenceContextTyoeはEntityFactoryImplメソッドに伝播されないため、エンティティマネージャは常にsynchronizedとして作成されます。 entityManagerを注入するときは、wildlfyが最初のメソッドを呼び出し、2番目のメソッドは呼び出さない。
@Override
public EntityManager createEntityManager(Map map) {
return internalCreateEntityManager(SynchronizationType.SYNCHRONIZED, map);
}
@Override
public EntityManager createEntityManager(SynchronizationType synchronizationType, Map map) {
errorIfResourceLocalDueToExplicitSynchronizationType();
return internalCreateEntityManager(synchronizationType, map);
}
だから私の質問:非同期永続コンテキストとエンティティマネージャのインスタンスを注入する方法?なぜWildfly
はエンティティマネージャを注入するときにtype = PersistenceContextType.EXTENDED
パラメータを無視しますか?何か不足していますか?