2016-06-03 9 views
0

Ich habe Code wie im Schnipsel unten. Frage: Warum kann ich nicht die Ausnahme in method1 fangen, statt doSomeOtherStuff() aufgerufen wird (was im Falle einer Ausnahme verhindert werden sollte)EJB TransactionRolledBackException ist nicht abgefangen

@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

Blick auf die STAPEL TRACE der Ausnahme und es sagt Ihnen, wo es geworfen wird, die Ihnen sagt, wo Sie es fangen können –

+0

Sie können die Stack-Trace enthalten? Wenn 'doSomeOtherStuff' aufgerufen wird, klingt es so, als ob die Ausnahme nicht von' method2' ausgelöst wird, sondern wenn die Transaktion in 'method1' endet. – hugh

Antwort

1

Ok, beantworten meine eigene Frage ;-)

Ausnahme tritt in em.merge() auf, wird aber nicht sofort ausgelöst. Der JPA-Container entscheidet, wann() die Zusammenführung() geleert wird.

Wenn ich den Code ein wenig ändern:

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

ich die Ausnahme sofort fangen.