2012-06-09 9 views
16

非ejbアプリケーションで次のコードを使用するにはどうすればよいですか。コードは機能します。JTA EntityManagerはgetTransaction()を使用できません

@Override 
public void saveItems(Collection<T> items) { 
    synchronized (em) { 
     EntityTransaction tx = em.getTransaction(); 
     try { 
      tx.begin(); 
      for (T item : items) { 
       saveItem_((Class<T>) null, item); 
      } 
      tx.commit(); 
     } finally { 
      if (tx.isActive()) { 
       tx.rollback(); 
      } 
     } 
    } 
} 

新しいアプリケーションでは、私はEJB3 + JSFを使用しており、上記のコードを含むライブラリを再利用したいと考えています。

<persistence-unit name="myApp" transaction-type="JTA"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <jta-data-source>MySQLConnection</jta-data-source> 
    </persistence-unit> 

それがこの行に当たったとき、私の新しいアプリケーションが例外をスロー:新しいアプリケーションのための私のperistenceユニットは、次のようになります

EntityTransaction tx = em.getTransaction(); 

例外は次のとおりです。

A JTA EntityManager cannot use getTransaction() 

はどれ十分にクリア。問題は、コンテナがトランザクションを管理するようにコードを変換する方法です。おそらく私の豆のメソッドは適切に注釈を付ける必要があります...質問はどうですか?

答えて

12

EntityTransactionは、リソースタイプがローカルのエンティティマネージャで使用されます。 JTAを使用する場合は、UserTransactionインターフェイスを使用する必要があります。

文書から:EntityTransaction - リソースローカルエンティティマネージャのトランザクションを制御するために使用されるインターフェイス。 EntityManager.getTransaction()メソッドは、EntityTransactionインターフェイスを返します。


編集:追加の擬似コード。

@Resource 
private SessionContext sessionContext; 

void execute(){ 

UserTransaction userTxn = sessionContext.getUserTransaction(); 

try{ 

userTxn.begin(); 
/** 
    * do-something 
    */ 
userTxn.commit(); 

    } catch(Throwable e){ 
    userTxn.rollback(); //-- Include this in try-catch 
    } 
} 
+3

ここに解決策はありますか? – rtcarlson

+0

@rtcarlsonなぜdownvoted&私は 'UserTransaction'インタフェースを使用する私の投稿をクリアしていない。 –

+0

@downvoterあなたが説明できない、理解できない場合、理由なしでdownvoteしないでください。 –

4

最も単純なケースでは、動作します。 EntityManagerをEJBに挿入して特別なアノテーションを使用しない場合、入力された最初のEJBメソッドでトランザクションが開きます(これは、EjbAがEjbBを呼び出し、EjbCを呼び出すと、すべてのEJBメソッド)。トランザクションの制御方法を変更する場合は、@ Transactionを参照してください。

ロールバックを行う最も簡単な方法は、@ApplicationException(ロールバック=真)

でマークされた例外をスローすることである私が間違っているかもしれないが、あなたのコードから判断すると、あなたはEXTENDEDとNORMALの差にまで読んでくださいEntityManager。あなたが非常に扱いにくい方法で拡張されたemを使用しているように見えます(トランザクションからループを移動すると、最終的に取り除くのに役立ちます)。

小編集:あなたがのUserTransactionを使用しようとする他のポストが示唆するように、標準のEntityManagerが(おそらく使用している)、いわゆるCMT(コンテナ管理のトランザクション)を使用するので、あなたは、エラーが発生します。アプリケーションは、EntityManagerを管理対

  • コンテナはEntityManagerを管理し、
  • コンテナを:あなたは(あなたがしたい場合、私は手の込んだことができますが、率直に言って、あなたがそれを必要としません)三つの基本opositionsを理解していない限り、それを触れないでください
  • NORMAL EntityManagerおよびEXTENDED EntityManagerです。
関連する問題