Salut à tous !

J'ai un étrange problème sur un de mes serveurs glassfish: visiblement mon EntityManager me fait un commit "dans le dos".
Pour commencer, voila mon code fonctionnant parfaitement de manière standard:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
 
userTransaction.begin();
 
MonEntite entite = new MonEntite(12345);
//... je set différentes valeurs
entityManager.persist(entite);
 
MonEntite persistedEntity = entityManager.createQuery("SELECT p FROM MonEntite p WHERE p.idpk=12345").getSingleResult();
//...
 
userTransaction.commit(); //OK => il y a le tuple 12345 en DB
A la fin de ce morceau de code, le tuple '12345' est bien dans la base de donnée (normal puisque la transaction a été committée correctement).
Maintenant le cas qui me pose problème:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
 
userTransaction.begin();
 
MonEntite entite = new MonEntite(12345);
//... je set différentes valeurs
entityManager.persist(entite);
 
MonEntite persistedEntity = entityManager.createQuery("SELECT p FROM MonEntite p WHERE p.idpk=12345").getSingleResult();
//...
 
// [Problème business, on doit annuler la transaction]
userTransaction.rollback(); //ERREUR => tuple 12345 existe dans la DB
Et la, si je regarde en base de données, le tuple '12345' a été committé
J'ai poussé le test un peu plus loin:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
userTransaction.begin();
 
MonEntite entite = new MonEntite(12345);
//... je set différentes valeurs
entityManager.persist(entite);
 
userTransaction.rollback(); //OK => pas de tuple 12345 en DB
Cela fonctionne parfaitement, la transaction est rollbackée correctement et le tuple n'est pas enregistré.
Le code suivant fonctionne également (pas de tuple enregistré):
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
 
userTransaction.begin();
 
MonEntite entite = new MonEntite(12345);
//... je set différentes valeurs
entityManager.persist(entite);
 
MonEntite persisted = entityManager.find(MonEntite.class, 12345);
 
userTransaction.rollback(); //OK => pas de tuple 12345 en DB
J'ai constaté ce souci sur un de mes serveurs glassfish. J'ai repris le tout en local sur ma machine et le problème n'existe pas (dans tous les cas l'entité n'est pas persistée dès qu'il y a un rollback).
J'imagine donc que j'ai du me planter dans une configuration du serveur glassfish, mais je ne vois pas vraiment ou... A noter que j'utilise JTA et que mon EntityManager est en FlushModeType.AUTO.

Quelqu'un aurait-il une idée ?

Merci d'avance