2009-11-24 53 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