Voila je cherche à réaliser des opérations en base de donnée dans un backedbean au moyen d'une BMT. Je tombe alors sur un pb étrange. Lorsque je tente d'enregistrer un bean EJB Entity depuis une méthode de mon backedbean JSF et bien selon la provenance des exceptions le rollback est possible où pas.

Je m'explique, si l'enregistrement de reportAuthor provoque une constrain violation au niveau de la base de donnée (noms identiques par ex) et bien l'appel au rollback provoque lui même une exception (de type No Transaction) et lorsque cela se produit on a:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
tx.getStatus() = Status.STATUS_NO_TRANSACTION
alors que si à la place une exception provenait non pas de la base de donnée mais du code directement et bien on aurait:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
tx.getStatus() = Status.STATUS_ACTIVE
et dans ce dernier cas de figure le rollback fonctionne et fait son oeuvre.

Des idées ?

Voici un extrait du code:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public String doSave() throws Exception {
 try {
  tx.begin();
 
  ReportAuthor reportAuthor = new ReportAuthor();
  reportAuthor.setFirstname(firstname);
  reportAuthor.setLastname(lastname);
 
  em.persist(reportAuthor);			
  tx.commit();
 } catch (Exception e) {	
  try {					
   tx.rollback();
  } catch (Exception e1) {
   throw e1;
  }
 }
}
L'objet transaction est injecté au moyen de l'annotation suivante:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
@Resource
UserTransaction tx;