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:
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:
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:
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:
1 2 3
|
@Resource
UserTransaction tx; |
Partager