2011-06-26 4 views
0

J'ai le scénario suivant,Comment valider une transaction dans EJB?

public void someEjbMethod1() 
{ 
    for (int i=0; i=10; i++) 
    { 
     em.merge(arr[i]); 
     em.flush(); 
    } 
} 

je dois fusionner chaque objet (arr[i]) séparément. comme le code ci-dessus va commettre toutes les instances arr[i] à la fin de la fonction.

Je pense à faire ce qui suit:

public void someEjbMethod1() 
{ 
    for (int i=0; i=10; i++) 
    { 
     saveObj(arr[i]); 
    } 
} 

// should I use a transaction attribute here?? 
public void saveObj(SomeObject obj) 
{ 
    em.merge(arr[i]); 
    em.flush(); 
} 

Répondre

1

Vous pouvez demander un UserTransaction, un coup d'oeil here pour un peu d'inspiration.

4

Si vous souhaitez des transactions gérées par des conteneurs, vous pouvez utiliser la @TransactionAttribute avec la valeur TransactionAttributeType.REQUIRES_NEW annoter la méthode saveObj comme:

@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 
public void saveObj(SomeObject obj) 
{ 
    ... 
} 

Cela permettra d'assurer qu'une nouvelle transaction est lancée pour chaque appel du saveObj méthode. La transaction existante associée au someEjbMethod sera suspendue avant chaque appel de la méthode saveObj. Chaque transaction commencée pour la méthode saveObj sera validée en retour, et par conséquent chaque entité sera mise à jour dans la base de données dans sa propre transaction.

+0

J'ai fait exactement ce que vous avez dit sur OC4J mais ne fonctionne toujours pas –

+0

Que voulez-vous dire par "ne fonctionne toujours pas"? La création de transaction échoue-t-elle à chaque invocation ou autre chose? En outre, envisagez d'activer le débogage plus fin du coordinateur JTA; vous serez en mesure de déterminer si une nouvelle transaction est en cours ou non. –

+0

Je veux dire, la base de données n'est pas mise à jour à chaque sortie de 'saveObj' Cependant, dans le journal du serveur d'applications, la requête SQL de mise à jour a été imprimée –

Questions connexes