2009-11-24 51 views
6

在不使用EJB的情況下將Seam使用數據庫事務的最佳實踐 - 即:當部署Seam作爲WAR?使用Seam POJO的手動交易POJO

默認情況下,Seam JavaBeans支持事務。我可以使用@Transactional註釋一個方法,並確保事務是必需的。或者我可以使用@Transactional(從不)或@Transactional(強制)。我無法找到如何做的是創建我自己的事務,設置超時,開始然後提交/回滾。

我已經嘗試使用:

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

但它不是被忽視,如果交易已經在進行中,或者如果我註釋方法與@Transactional(NEVER)

返回javax.transaction.NotSupportedException

任何幫助表示讚賞。謝謝。

+0

給@Transactional – Bozho 2009-11-24 11:31:07

+0

org.jboss.seam.annotations.Transactional的全名 – Damo 2009-11-24 12:33:32

回答

8

如您所知,交易管理是一個交叉問題。因此,您的代碼在模塊中散佈時並不是一個好主意,因爲這些問題並不是他們主要關心的問題。

如果您在非EJB環境中使用JTA UserTransaction,那麼JTA是可用的(Apache Tomcat不支持JTA)。

1°規則

Seam事務管理默認情況下所有JSF請求(SEAM 2.0+)啓用。

我覺得Seam事務管理聲音由Seam管理的更好,因爲交易。這意味着Seam需要在幕後調用begin和commit。 POJO + JTA avaliable(Apache Tomcat上不支持JTA)Seam使用

事務管理器:org.jboss.seam煤層在使用Seam事務管理

1°情景扮演事務管理中的作用.transaction.UTtransaction

啓用在非EJB環境默認(戰爭)時,可JTA(JBoss的支持JTA)

如果你正在使用JPA的EntityManager或Hibernate的Session,你需要註冊後才能允許Seam管理交易界限

參見9.3. Seam-managed persistence contexts如何設置Seam管理的持久上下文(通過使用@In注入)

然後注入的EntityManager(EntityManager的)或使用@In(作用域ScopeType會話(休眠)。會話)

@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 
    } 

} 

在幕後,煤層事務管理器網羅了EntityManager(JPA)或會話(休眠)在有源JTA的UserTransaction,通過調用joinTransaction方法

2°場景:POJO + RESOURCE_LOCAL由煤層(JPA)使用(無論是休眠或JPA)事務

事務管理器:org.jboss.seam.transaction.EntityTransaction

Transa被Seam(休眠)使用ction經理:org.jboss.seam.transaction.HibernateTransaction

9.3. Seam-managed persistence contexts如何建立一個Seam管理的持久化上下文(通過使用@In注入)

在幕後,Seam事務經理需要調用開始,通過使用代理

3°情景在底層技術承諾的護理:EJB Seam使用

事務管理器:org.jboss.seam.transaction.CMTTransaction

默認情況下在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 2012-05-24 07:35:14