2011-06-26 11 views
0

私は別々に(arr[i])の各オブジェクトをマージする必要が次のシナリオ、EJBでトランザクションをコミットする方法は?

public void someEjbMethod1() 
{ 
    for (int i=0; i=10; i++) 
    { 
     em.merge(arr[i]); 
     em.flush(); 
    } 
} 

を有します。上記のコードは関数の最後にすべてのarr[i]インスタンスをコミットするためです。

私は次の操作を実行するために考えています:

public void someEjbMethod1() 
{ 
    for (int i=0; i=10; i++) 
    { 
     saveObj(arr[i]); 
    } 
} 

// should I use a transaction attribute here?? 
public void saveObj(SomeObject obj) 
{ 
    em.merge(arr[i]); 
    em.flush(); 
} 

答えて

1

あなたがたUserTransactionを要求することができますが、いくつかのインスピレーションのために見hereを持っています。

4

あなたは、コンテナ管理トランザクションを使用する場合は、あなたのようにsaveObjメソッドに注釈を付けるために値TransactionAttributeType.REQUIRES_NEWで@TransactionAttributeを使用することがあります。これは、新しいトランザクションがの呼び出しごとに開始されることを保証します

@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 
public void saveObj(SomeObject obj) 
{ 
    ... 
} 

saveObj方法。 someEjbMethodに関連付けられた既存のトランザクションは、saveObjメソッドが呼び出されるたびに中断されます。 saveObjメソッドで開始されたすべてのトランザクションはリターン時にコミットされるため、すべてのエンティティはデータベース内で自身のトランザクションで更新されます。

+0

OC4Jで述べた内容とまったく同じでしたが、まだ動作しません。 –

+0

「まだ動作しません」とはどういう意味ですか?呼び出しのたびにトランザクションの作成が失敗しますか?また、JTAコーディネーターのより詳細なデバッグを可能にすることも検討してください。新しいトランザクションが開始されているかどうかを判断することができます。 –

+0

つまり、データベースは 'saveObj'の各終了時に更新されませんが、アプリケーションサーバーログでは、更新SQLクエリが出力されます –

関連する問題