Я пытаюсь полностью понять разграничение JTA с CMT. Поведение, которое я испытываю, заключается в том, что в EJB соблюдается только первый @TransactionAttribute метода, а последующие вызовы метода того же компонента с разными аннотациями @TransactionAttribute не учитываются.
Пример:
@Stateless
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public class Foo implements IFoo {
@EJB
private IBar barBean;
// inherits class transaction annotation of NOT_SUPPORTED
public void doSomething() {
barBean.doAction();
}
}
@Stateless
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public class Bar implements IBar {
public void doAction() {
Entity entity = bar.find();
entity.setName("new name");
// fails with EJBException with TransactionRequiredException as cause
save(entity);
}
public Entity find() {
// return some persisted entity.
return em.findById(1);
}
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public Entity save(entity) {
em.persist(em.merge(entity));
em.flush();
}
}
Поведение, которое я вижу, заключается в том, что Bar.save() генерирует исключение TransactionRequiredException. Итак, это говорит мне, что аннотация REQUIRED, установленная в save(), не создает транзакцию. REQUIRES_NEW тоже не работает. Если я перенесу save() в другой EJB, он будет работать, как и ожидалось.
Означает ли это, что учитывается только первая аннотация TransactionAttribute независимо от последующих вызовов метода для того же с другими значениями аннотации? Это ошибка или ожидаемое поведение? Кажется, я не могу найти документацию, которая конкретно объясняет это. Я ценю любое понимание этого.
Мой стек: EJB 3.0, Toplink Essentials, GF V2UR2