未捕获EJB TransactionRolledBackException

时间:2016-06-03 10:26:21

标签: jpa exception java-ee ejb

我的代码就像下面的代码段一样。问题是:为什么我不能在method1中捕获异常,而是调用doSomeOtherStuff()(在异常的情况下应该防止)

@Stateless
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class EJBBean1 {

    @EJB
    private EJBBean2 ejb2;

    public void method1(Produkt p){
        try {
            ejb2.method2(p)
            doSomeOtherStuff();//is always called
        }
        catch(Exception e) {
            //e is never catched here!!!
        }           
    }
}


@Stateless
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class EJBBean2 {

    @PersistenceContext(unitName = "scm")
    protected EntityManager em;


    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
    public void method2(Produkt p) {
        em.merge(p)//Exception rises here (in merge)
    }
}

1 个答案:

答案 0 :(得分:1)

好的,回答我自己的问题; - )

异常确实在em.merge()中出现,但不会立即抛出。 JPA容器决定何时刷新()merge()。

如果我稍微改变一下代码:

@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
    public void method2(Produkt p) {
        em.merge(p)
        em.flush();//Exception rises here
    }

我可以立即捕捉到异常。