【问题标题】:javax.persistence.TransactionRequiredException after setRollbackOnlysetRollbackOnly 之后的 javax.persistence.TransactionRequiredException
【发布时间】:2013-08-16 08:50:16
【问题描述】:

我在一个容器管理的事务 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 书(搜索“注定的交易”或转到第 299 页)中是这样解释的,因为它不会引发任何此类异常,而是您应该只在资源之前检查ejbContext.getRollbackOnly() -饥饿的操作。

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

【问题讨论】:

    标签: transactions ejb ejb-3.0 ejb-3.1


    【解决方案1】:

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

    【讨论】:

    • 嗯,这是对我的情况的唯一解释,但在“setRollBackOnly()”的文档中,没有任何关于当前事务的取消关联的内容(在 EJB 3.1 规范中也没有) docs.oracle.com/javaee/6/api/javax/ejb/… 所以我可以假设这是一个 BUG。我在 Jboss 7.1.1 中尝试过。你用什么 AS 试过?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-16
    相关资源
    最近更新 更多