2010-07-26 13 views
1
@Stateless @LocalBean 
    public class MySLSB { 

      @Resource 
      SessionContext ctx; 
      @PersistenceContext(unitName = "myPU") 
      EntityManager em; 

      public void T1() { 
       em.persist(new MyEntity(1L)); //T1 created! 
/* wrong call to plain java object    
T2(); 
*/  
//corrected by lookup its business object first 
ctx.getBusinessObject(MySLSB.class).T2(); 
    ctx.setRollbackOnly(); 
      } 

      @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 
      public void T2() { 
       em.persist(new MyEntity(2L)); //T2 created! 
      } 
     } 

Le client appelle T1(), au premier T2 comme une nouvelle transaction doit être engagée, mais T1 sera annulée.EJB CMT TransactionAttributeType.REQUIRES_NEW ne fonctionne pas

résultat escompté:

T1: insérer dans set MyEntity id = 1; T2: insérer dans myentity set id = 2;

T2: validation;

T1: rollback;

-> La ligne avec id = 2 est créée en DB.

résultat réel:

insert en jeu de MyEntity id = 1;

insérer dans l'ensemble myentity id = 2;

rollback;

-> Rien n'est créé dans DB.

Quel est le problème? Merci beaucoup!

Répondre

1

@Solution

Le problème est résolu. J'ai fait une erreur naïve.

L'appel à T2() doit rechercher son objet métier, appel direct à T2() IS simplement à son objet Java simple.

J'ai mis à jour le code sur la question ci-dessus, tout a fonctionné comme prévu.

2

Il peut être plus facile de déclarer l'auto-référence @EJB MySLSB me; et d'appeler me.T2(); au lieu d'utiliser ctx.getBusinessObject(MySLSB.class). Mais le sens est le même.