运行时异常是@ApplicationException(rollback = false),但最终会回滚事务

时间:2015-05-14 20:18:51

标签: java java-ee transactions ejb

我的运行时异常

@ApplicationException(rollback=false)
public class UncheckedException extends RuntimeException {}

我的EJB代码

@Stateless
@Transactional(TxType.REQUIRES_NEW)
public class ContainerManagedTransactionBean {

    @PersistenceContext EntityManager em;

    public void insertAndThrowUnchecked() throws UncheckedException {
        em.persist(new Entry());
        throw new UncheckedException();
    }

}

我的另一个EJB是客户端

@Singleton
@Startup
@Transactional(TxType.NOT_SUPPORTED)
public class Start {

    @EJB
    ContainerManagedTransactionBean bean;

    @PostConstruct
    public void start() {
        //...       
        try {
            bean.insertAndThrowUnchecked();
        } catch (Exception e) {
            System.out.println("Start unchecked exception catched");
        }
    }

有人可以解释为什么insertAndThrowUnchecked会回滚吗?

在类似情况下,检查异常时

@ApplicationException(rollback=false)
public class CheckedException extends Exception {}

交易已经提交。

工作示例位于this GitHub link

我将很感激清楚解释并链接到EJB规范的适当部分

1 个答案:

答案 0 :(得分:1)

根据EJB 3.2规范的第7.1节:

  

关联JTA事务拦截器是违法的(见[8])   使用Enterprise JavaBeans。 EJB容器应该部署失败   这样的申请。[39]

     

[39]此限制可能会在本规范的未来版本中删除。

由于@Transactional注释被错误地用于在EJB上指定JTA事务拦截器,因此@ApplicationException注释无效。请尝试使用@TransactionAttribute注释。