2016-08-09 7 views
0

私は、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パラメータを無視しますか?何か不足していますか?

答えて

0

同期型は注入されたenntiyManagerに伝播するので、EntityManagerFactoryを使用してentityMangerを作成できることに気付きました。ファクトリには同期型を受け付けるメソッドがあり、非同期化されたコンテキストが作成されます。

@PersistenceUnit 
private EntityManagerFactory emf; 
... 
emf.createEntityManager(SynchronizationType.UNSYNCHRONIZED); 

また、私はこの問題はWildFly 8.1 https://issues.jboss.org/browse/WFLY-5006

に対してログインしてことがわかりました
関連する問題