gpt4 book ai didi

hibernate - Seam POJO 的手动事务

转载 作者:行者123 更新时间:2023-12-03 08:10:00 27 4
gpt4 key购买 nike

在不使用 EJB 时,将数据库事务与 Seam 一起使用的最佳实践是什么 - 即。将 Seam 部署为 WAR 时?

默认情况下,Seam JavaBeans 支持事务。我可以用 @Transactional 注释一个方法,这将确保需要一个事务。或者我可以使用@Transactional(NEVER) 或@Transactional(MANDATORY)。我不知道该怎么做是创建自己的事务,设置超时,开始然后提交/回滚。

我试过使用:

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

但是,如果事务已经在进行中,则它要么被忽略,要么如果我用 @Transactional(NEVER) 注释该方法,则返回 javax.transaction.NotSupportedException

任何帮助表示赞赏。谢谢。

最佳答案

如您所知,事务管理是一个横切关注点。因此,您的代码分散在模块中并不是一个好主意,而这些关注点不是他们的主要关注点。

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

1°规则

Seam transaction management is enabled by default for all JSF requests (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 注入(inject))

然后使用@In(范围为ScopeType.CONVERSATION)注入(inject)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 注入(inject))

在幕后,Seam Transaction Manager 通过使用代理在底层技术中处理调用 begin 和 commit

3°场景 : EJB

Seam 使用的事务管理器:org.jboss.seam.transaction.CMTTransaction

在 EJB 环境中默认启用。注意,在这种情况下,Seam 不控制容器管理的事务。

问候,

关于hibernate - Seam POJO 的手动事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1789467/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com