J'essaie de comprendre pleinement la démarcation JTA avec CMT. Le comportement que je rencontre est que seul le premier @TransactionAttribute de la méthode est respecté sur l'EJB et que les invocations de méthodes suivantes du même bean avec des annotations @TransactionAttribute différentes ne le sont pas.Où exactement la démarcation des transactions JTA pour CMT est-elle respectée?
Exemple:
@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();
}
}
Le comportement que je vois est que Bar.save() jette un TransactionRequiredException. Cela m'indique que l'annotation REQUIRED définie sur save() ne crée pas de transaction. REQUIRES_NEW ne fonctionne pas non plus. Si je déplace le save() vers un autre EJB, cela fonctionne comme prévu. Cela signifie-t-il que seule la première annotation TransactionAttribute est respectée indépendamment des invocations de méthodes ultérieures sur la même chose avec des valeurs d'annotation différentes? Est-ce un bug ou le comportement attendu? Je n'arrive pas à trouver de documentation qui explique cela concrètement. J'apprécie tout aperçu à ce sujet.
Ma pile: EJB 3.0, Toplink Essentials, GF V2UR2
Votre explication a du sens. J'ai été en mesure de toucher la base avec un autre collègue et il a également été d'accord avec votre déclaration. J'apprécie votre temps. – Hoon