如您所知,事务管理是一个横切关注点。因此,您的代码分散在模块中并不是一个好主意,而这些关注点不是他们的主要关注点。
如果您在非 EJB 环境中使用 JTA UserTransaction,那么 JTA 是可用的(Apache Tomcat 不支持 JTA)。
1°规则
Seam 事务管理默认启用所有 JSF 请求(Seam 2.0+)。
我认为 Seam 事务管理 听起来比 由 Seam 管理的事务 更好。这意味着 Seam 在幕后负责调用 begin 和 commit。 Seam 通过使用 Seam 事务管理器扮演事务管理器的角色
1°场景:POJO + JTA 可用(Apache Tomcat 不支持 JTA)
Seam 使用的事务管理器:org.jboss.seam.transaction.UTtransaction
当 JTA 可用时,在非 EJB 环境(war)中默认启用(JBoss 支持 JTA)
如果您使用 JPA EntityManager 或 Hibernate Session,则需要注册它们以允许 Seam 管理事务边界
参见9.3. Seam-managed persistence contexts 如何设置Seam 管理的持久化上下文(使用@In 注入)
然后使用@In(作用域为ScopeType.CONVERSATION)注入一个EntityManager(EntityManager)或Session(Hibernate)
@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 Transaction Manager 通过调用 joinTransaction 方法在活动的 JTA UserTransaction 中登记 EntityManager (JPA) 或 Session (Hibernate)
2°场景:POJO + RESOURCE_LOCAL(Hibernate 或 JPA)事务
Seam (JPA) 使用的事务管理器:org.jboss.seam.transaction.EntityTransaction
Seam(Hibernate)使用的事务管理器:org.jboss.seam.transaction.HibernateTransaction
参见9.3. Seam-managed persistence contexts 如何设置Seam 管理的持久化上下文(使用@In 注入)
在幕后,Seam Transaction Manager 使用代理在底层技术中负责调用 begin 和 commit
3°场景:EJB
Seam 使用的事务管理器:org.jboss.seam.transaction.CMTTransaction
在 EJB 环境中默认启用。请注意,在这种情况下,Seam 不控制容器管理的事务。
问候,