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.

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;
..
}
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.

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.

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();
     ...
}
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
  public MySessionBean implements SessionBean {
  ...
    public someMethod()
    {
         ...
        Context initCtx = new InitialContext();
        UserTransaction utx =  (UserTransaction)initCtx.lookup(“java:comp/UserTransaction”);
        utx.begin();
        ...
        utx.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
14
public MySessionBean implements SessionBean 
{
   ...
   SessionContext ctx;
   ...
   public someMethod() 
   {
       UserTransaction utx = ctx.getUserTransaction();
       utx.begin();
       ...
       utx.commit();
   }
   ...
}
Bon les 2 dernières on voit bien que ce sont des méthodes de la sessionbean...

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.



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
	{
	}
}
1) Tout d'abord est-il utile de changer la session bean avec le code ci dessus et est ce bien ce code?

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...