JTA не откатывает транзакцию, когда RuntimeException выбрасывается в другом бине? - PullRequest
0 голосов
/ 13 июня 2019

У нас есть 3 EJB для управления нашим бизнесом, как показано ниже:

@Stateless
public class BeanA {

    @PersistenceContext(unitName = "primary")
    private EntityManager em;

    @EJB private BeanB beanB;

    public void handle() {

      EntityA entity= new EntityA();
      ....

      beanB.handle();

      em.persist(entity); //Transaction does not rollback and saved entity


    }
 }  

@Stateless
public class BeanB {

     @EJB private BeanC beanC;

     public void handle() {
        beanC.handle();
     }
}

@Stateless
public class BeanC {

     public void handle() {

        try {
           throw new RunTimeException("error occurred!!");       
        } catch(RunTimeException e) {
            e.printStacktrace();

        }
     }
}

Согласно концепции JTA, что в случае возникновения RuntimeExcpetion текущая транзакция будет откатом, я ожидал, что вышеуказанная транзакция должна быть откатом, но не откатом. также мы используем Wildfly10 в качестве сервера приложений и активную опцию JTA = "true" в источниках данных.

Есть ли идеи по поводу этой проблемы?

1 Ответ

0 голосов
/ 17 июня 2019

Вам нужно выбросить исключение из EJB, не перехватывая его в том же самом.Измените BeanC на следующую реализацию.

@Stateless
public class BeanC {

     public void handle() {

          throw new RuntimeException("error occurred!!");       
     }
}
...