У меня есть простой класс EJB без сохранения состояния с двумя методами, оба без @TransactionAttribute. Первый метод сохраняет пиво и вызывает другой, который сохраняет другое пиво и выдает исключение.
@Stateless
public class EJBContainer {
@PersistenceContext
EntityManager em;
public void testTransaction() {
em.persist(getBeer("Corona"));
try {
saveAndThrowException();
} catch (Exception e) {
e.printStackTrace();
}
}
public void saveAndThrowException() {
em.persist(getBeer("Heineken"));
throw new RuntimeException();
}
//getBeer() definition
}
Я предполагал, что оба метода будут использовать тип транзакции по умолчанию (обязательно), поэтому новая транзакция будет создана в первый метод, и он будет использоваться во втором методе. Таким образом, генерирование исключения должно откатить эту транзакцию, и EntityManager не будет сохранять пиво. Но оказалось, что оба пива были спасены. Где я ошибаюсь?
Когда я переместил второй метод в другой EJB без сохранения состояния, он работал так, как я предполагал - первый EJB создал новую транзакцию, второй использовал ее, исключение вызвало откат, и пиво не было сохранено.
EJB вызывается из этого клиента JAX-RS:
@ApplicationScoped
public class BeerController {
@Inject
private EJBContainer ejbContainer;
@POST
public void addBeer() {
ejbContainer.testTransaction();
}
}