如您所知,事务管理是一个横切关注点。因此,在那些不是其主要关注点的模块中散布代码并不是一个好主意。
如果您在非EJB环境中使用JTA UserTransaction,则JTA可用(Apache Tomcat不支持JTA)。
第一条规则:
Seam事务管理默认为所有JSF请求启用(Seam 2.0+)。
我认为“Seam事务管理”听起来比“由Seam管理的事务”更好。它意味着Seam在幕后负责调用begin和commit。Seam通过使用Seam事务管理器扮演事务管理器的角色。
第一种情况:POJO + JTA可用(Apache Tomcat不支持JTA)
Seam使用的事务管理器:org.jboss.seam.transaction.UTtransaction
在JTA可用的非EJB环境(war)中默认启用(JBoss支持JTA)
如果您正在使用JPA EntityManager或Hibernate Session,则需要注册它们以允许Seam管理事务边界。
请参阅
9.3. Seam管理的持久性上下文,了解如何设置Seam管理的持久性上下文(通过使用@In注入)。然后,通过使用@In(作用域为ScopeType.CONVERSATION)来注入EntityManager(EntityManager)或Session(Hibernate)。
@Name("businessService")
public class BusinessServiceImpl implementes BusinessService {
@In
private EntityManager entityManager;
public void doSomething() {
}
}
在幕后,Seam事务管理器通过调用joinTransaction方法将EntityManager(JPA)或Session(Hibernate)注册到活动的JTA UserTransaction中。
第二种情况:POJO + RESOURCE_LOCAL(Hibernate或JPA)事务
Seam使用的事务管理器(JPA):org.jboss.seam.transaction.EntityTransaction
Seam使用的事务管理器(Hibernate):org.jboss.seam.transaction.HibernateTransaction
请参见9.3.Seam托管的持久性上下文如何设置Seam托管的持久性上下文(通过使用@In注入)
在幕后,Seam事务管理器通过使用代理来处理调用底层技术中的begin和commit操作
第三种情况:EJB
Seam使用的事务管理器:org.jboss.seam.transaction.CMTTransaction
在EJB环境中默认启用。请注意,在这种情况下,Seam不控制容器管理的事务。
敬礼,