1

我在一个容器管理的事务 bean 中是这样的:

  @PersistenceContext
  private EntityManager em;

  @Resource
  private EJBContext ejbContext;


  public void testTransaction() {
    Model model1 = new Model();
    em.persist(model1);

    ejbContext.setRollbackOnly();

    Model model2 = new Model();
    em.persist(model2);//the line the problem
  }

在最后一行(有问题)抛出 TransactionRequiredException:

javax.ejb.EJBException: javax.persistence.TransactionRequiredException: JBAS011469: Transaction is required to perform this operation (either use a transaction or extended persistence context)

但在Mastering EJB 第 4 版一书中(搜索“Doomed Transactions”或转到第 299 页)中是这样解释的,因为它不会引发任何此类异常,相反,您应该ejbContext.getRollbackOnly()只在需要资源的操作之前检查。

当然,在这个简单的示例中,我可以通过抛出一个带有注释的异常来避免这个问题@ApplicationException(rollback=true),但我只是想知道我错过了什么。

4

1 回答 1

0

通过调用 ejbContext.setRollbackOnly() 您已经中止了容器启动的当前事务。之后,没有可以为 em.persist(model2); 关联的事务。所以你得到一个例外。要检查事务是否处于活动状态,请使用 ejbcontext 中的 getRollbackOnly() 方法,该方法将返回 false。

于 2013-08-19T11:44:11.080 回答