Bonjour,
je ne comprends pas trop comment on gère les transactions dans une appli j2EE.
tout d'abord:
J'ai une sessionbean et son interface qui me sert de façade et des entitys.
voilà..ensuite je sais que qu'un certain niveau de transaction est géré par les ejb3.0, notament quand on fait des persist/remove... sur des entities avec des relations manytoone, onetomany, etc.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 // public @Stateless class ManagerBean implements Manager { @PersistenceContext private EntityManager manager; .. }
Mais je souhaiterai effectuer un scénario, c'est à dire faire une suite d'enregistrements indépendantes, et donc que toutes celles ci soient dans une transaction, car si il en manque une je voudrais faire un rollback.
Sans les transactions c'est simple.
Mais je ne voit pas ce qu'il faut modifier dans mon code :
j'ai lu la doc ejb3.0 :
Donc déjà si j'ai bien compris, ce sont 3 méthodes pour faire exactement la même chose, sauf si je me trompe...
The following example illustrates how an enterprise bean acquires and uses a UserTransaction object via injection.
The following code example
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 @Resource UserTransaction tx; ... public void updateData(...) { ... // Start a transaction. tx.begin(); ... // Perform transactional operations on data. ... // Commit the transaction. tx.commit(); ... }
is functionally equivalent to
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 public MySessionBean implements SessionBean { ... public someMethod() { ... Context initCtx = new InitialContext(); UserTransaction utx = (UserTransaction)initCtx.lookup(java:comp/UserTransaction); utx.begin(); ... utx.commit(); } ... }
Bon les 2 dernières on voit bien que ce sont des méthodes de la sessionbean...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 public MySessionBean implements SessionBean { ... SessionContext ctx; ... public someMethod() { UserTransaction utx = ctx.getUserTransaction(); utx.begin(); ... utx.commit(); } ... }
donc on appelle les méthodes enter le begin() et le commit()..jusque la ca va.
Mais j'ai lu autre part qu'il y avait des tags à changer et notemment le @PersistenceContext.
1) Tout d'abord est-il utile de changer la session bean avec le code ci dessus et est ce bien ce code?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 @Stateful @TransactionManagement(value=TransactionManagementType.CONTAINER) public class ManagerBean implements Manager { @TransactionAttribute(value=TransactionAttributeType.REQUIRED) public void mamethode { } }
2) Si je change, dois-je mettre des tags
"@TransactionAttribute(value=TransactionAttributeType.REQUIRED)"
à toutes mes méthodes et quel est le comportement des méthodes sans ses tags?, elle reste identiques?
suffit il de rajouter
"@PersistenceContext
private EntityManager manager;"
dans le code ci dessus? pour garder le comportement des méthodes sans transactions?
3) sinon suffit-il de rajouter une des 3 méthodes de transaction dans la session bean et d'appeler les méthodes entre le begin() et le commit() sans changer le code des méthodes?
voilà, je ne connaissais pas vraiment les transactions et les problèmes liés à l'enregistrement dans une BD, merci pour vos réponses et désolé si en fait c'est super simple...
Partager