使用Seam POJO进行手动交易

Dam*_*amo 6 hibernate seam jpa transactions

在不使用EJB时​​使用Seam的数据库事务的最佳实践是什么 - 即.何时将Seam部署为WAR?

默认情况下,Seam JavaBeans支持Transactions.我可以用@Transactional注释一个方法,这将确保需要一个事务.或者我可以使用@Transactional(NEVER)或@Transactional(MANDATORY).我无法弄清楚如何创建自己的事务,设置超时,开始然后提交/回滚.

我尝试过使用:

UserTransaction utx = Transaction.instance();
utx.setTransactionTimeout(2000);
utx.begin();
Run Code Online (Sandbox Code Playgroud)

但是如果事务正在进行中则被忽略或者如果我使用@Transactional(NEVER)注释方法则返回javax.transaction.NotSupportedException

任何帮助赞赏.谢谢.

Art*_*ald 8

如您所知,交易管理是一个贯穿各领域的问题.因此,您的代码分散在模块中并不是一个好主意,因为这些问题不是他们主要关注的问题.

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

1°规则

默认情况下,为所有JSF请求启用 Seam事务管理(Seam 2.0+).

我认为Seam交易管理听起来更好,因为Seam管理的交易.这意味着Seam会在幕后关注调用begin和commit.Seam通过使用Seam Transaction Manager扮演事务管理器的角色

1°场景:POJO + JTA avaliable(Apache Tomcat不支持JTA)

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

当JTA可用时(JBoss支持JTA),默认情况下在非EJB环境(war)中启用

如果您正在使用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() {
        // 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
    }

}
Run Code Online (Sandbox Code Playgroud)

在幕后,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管理的持久性上下文如何设置Seam管理的持久化上下文(使用@In注入)

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

3°场景:EJB

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

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

问候,


Dam*_*amo 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()
}
Run Code Online (Sandbox Code Playgroud)

但是,如果一个事务已在进行中并且您想要加入它,那么您可以使用userTx.isActive()等