setRollbackOnly之后的javax.persistence.TransactionRequiredException

时间:2013-08-16 08:50:17

标签: transactions ejb ejb-3.0 ejb-3.1

我在Containter管理的事务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 4th edition书中(搜索“Doomed Transactions”或转到第299页)会对此进行解释,因为它不会抛出任何此类异常,而是应该检查{{1}只有在资源匮乏的运营之前。

当然,我可以在这个简单的例子中通过抛出一个用ejbContext.getRollbackOnly()注释的Exception来避免这个问题,但我只是想知道我错过了什么。

1 个答案:

答案 0 :(得分:0)

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