Bonjour à tous,
En considérant l'algorithme suivant :
EjbA.creerPersonne(Personne p) :
EjbB.creerEntreprise(Entreprise e) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 - Paramétrer p - Appeler EjbB.creerEntreprise(p.getEntreprise()) - Sauvegarder p - XXX - Retourner p
Je suis sur Glassfish 301.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 - Paramétrer e - Sauvegarder e - retourner e
J'ai cru comprendre, grosso modo, que les transactions étaient gérées "automatiquement" à l'appel des méthodes EJB (j'utilise l'EntityManager au fait pour mes connexions à la base de données). Je n'utilise pas de TransactionAttribute sur ma méthode ou ma classe, donc il semblerait que l'attribut utilisé par défaut soit REQUIRED.
En supposant que je lève une exception à la ligne que j'ai notée XXX ci-dessus, j'ai pas mal de problèmes qui apparaissent :
- L'objet Entreprise créé est persisté en base, donc pas de rollback sur sa création.
- Pareil pour l'objet Personne
- Mes deux objets utilisent une table séquence pour leur ID (@GeneratedValue(strategy = GenerationType.TABLE) : L'objet est inséré mais l'ID n'est pas mis à jour dans ma table séquence. Cela signifie que je dois faire un update à la main pour rattraper le tir, sinon j'ai un duplicate exception. Il semblerait que le Rollback soit donc fait sur les tables séquences, mais pas sur les entités.
Est-ce que quelqu'un pourrait m'expliquer ce qui ne va pas ? Je dois écrire quoi pour que mes transactions soient correctement gérées, et surtout que mes tables "séquence" restent bien synchronisées avec les objets qu'elles gèrent ?
En vous remerciant par avance.
Partager