2009-11-24 13 views
6

EJBを使用していないときにSeamでデータベーストランザクションを使用する場合のベストプラクティスは何ですか? SeamをWARとしてデプロイするときは?Seamとの手動トランザクションPOJO

デフォルトでは、Seam JavaBeansはトランザクションをサポートします。 @Transactionalでメソッドに注釈を付けることができ、トランザクションが確実に行われるようになります。または、@Transactional(NEVER)または@Transactional(MANDATORY)を使用できます。私は自分のトランザクションを作成し、タイムアウトを設定し、開始してからコミット/ロールバックする方法を見つけることができません。

私が使用して試してみました:トランザクションがすでに進行中であるか、私は@Transactional(NEVER)

とメソッドに注釈を付ける場合javax.transaction.NotSupportedExceptionを返す場合

UserTransaction utx = Transaction.instance(); 
utx.setTransactionTimeout(2000); 
utx.begin(); 

をしかし、それは無視されますか、

助けていただければ幸いです。ありがとう。

+0

は@Transactional – Bozho

+0

org.jboss.seam.annotations.Transactional – Damo

答えて

8

ご存じのように、トランザクション管理は横断的な関心事です。だから、あなたのコードは、それらの懸念事項が第一の関心事ではないモジュールで散らばっているのは良い考えではありません。

EJB以外の環境でJTA UserTransactionを使用している場合は、JTAを使用できます(Apache TomcatはJTAをサポートしていません)。

1度ルール

シームトランザクション管理は、すべてのJSFリクエスト(シーム2.0+)のデフォルトで有効になっています。

私は取引Seamのによって管理としてシームトランザクション管理が良く聞こえると思います。これはSeamがbeginとcommitを呼び出すことの背後で心配することを意味します。 POJO + JTA avaliable Seamによって使用

トランザクションマネージャを(Apache TomcatはJTAをサポートしていません):org.jboss.seam SeamはSeamトランザクションマネージャ

1°シナリオを使用して、トランザクションマネージャの役割を果たしています.transaction.UTtransaction利用可能JTA(JBossのサポートJTA)

あなたはJPAのEntityManagerまたはHibernateのSessionを使用している場合は、それらを登録する必要がありますが、Seamが管理することができたときに非EJB環境(戦争)ではデフォルトで有効になっ

トランザクション境界

はその後ScopeTypeにスコープ@Inを(使用してのEntityManager(のEntityManager)またはセッション(休止状態)を注入(@Inを使って注入)シーム管理の永続コンテキストに

をセットアップする方法9.3. Seam-managed persistence contextsを参照してください。CONVERSATION)舞台裏

@Name("businessService") 
public class BusinessServiceImpl implementes BusinessService { 

    @In 
    private EntityManager entityManager; 

    public void doSomething() { 
     // You do not need to call entityManager().getTransaction().begin(); 
     // because Seam Transaction Manager takes care of it 
     // By using proxies 
     // Therefore, if you call entityManager().getTransaction().begin() 
     // You will get IllegalStateException 

     // Some EntityManager operations persist, find etc 

     // You do not need to call entityManager().getTransaction().commit(); 
     // because Seam Transaction Manager takes care of it 
     // By using proxies 
    } 

} 

に、SeamトランザクションマネージャはjoinTransaction方法

2°シナリオ呼び出すことにより、アクティブなJTAのUserTransactionでのEntityManager(JPA)またはセッション(休止状態)を参加させる:POJO + RESOURCE_LOCALをシーム(JPA)によって使用される(どちらか休止状態またはJPA)の取引

トランザクションマネージャ:org.jboss.seam.transaction.EntityTransaction

TRANSA ction Managerは、シーム(休止状態)で使用される:org.jboss.seam.transaction.HibernateTransaction

は(@Inを使って注入)シーム管理の永続コンテキスト舞台裏

をセットアップする方法9.3. Seam-managed persistence contextsに、Seamトランザクションを参照してください。 EJB Seamによって使用

トランザクションマネージャ:org.jboss.seam.transaction.CMTTransaction

01 Managerが開始し、使用してプロキシ

3°シナリオによって基礎となる技術にコミット呼び出しの面倒を見ます

EJB環境では、デフォルトで有効になっています。その場合、Seamはコンテナ管理のトランザクションを制御しません。

に関して、

5

私は現在働いている方法は、このようなものです:

//don't use @Transactional annotation 
public void doStuff() { 
    UserTransaction userTx = (UserTransaction) org.jboss.seam.Component.getInstance("org.jboss.seam.transaction.transaction"); 
    userTx.setTransactionTimeout(10 * 60); //set timeout to 60 * 10 = 600 secs = 10 mins 
    userTx.begin(); 

    /*If entity manager is created before the transaction is started (ie. via Injection) then it must join the transaction */ 
    entityManager.joinTransaction(); 

    //do stuff  

    entityManager.persist(user); 
    entityManager.flush(); //logs will show an insert at this point 

    userTx.commit(); //or rollback() 
} 

が、トランザクションがすでに進行中であり、あなたがそれに参加したい場合、あなたは(userTx.isActiveを使用)など

+0

優秀な男の完全修飾名を与えます!これを使用して、「トランザクションはアクティブではありません」という例外を避けることができます。 – prageeth

関連する問題