Mise à jour de ma réponse :
- Vous souhaitez que votre méthode "public Quote save(Quote quote)" soit transactionnelle.
- lorsque cette méthode est invoquée ... la transaction commence dans le TransactionInterceptor et à partir du proxy "public Quote save(Quote quote)" est invoqué
- Ligne "quoteLineDao.delete(new Long(44));" fonctionne bien
- Ligne "System.out.println("°°°°°°°°°°°°°°°°°°Ligne 44 supprimée");" fonctionne bien
- Ligne "quoteDao.save(quote);" donne une exception de violation de contrainte. La transaction est marquée comme annulée
- vous attrapez cette exception et la consommez et ne propagez pas l'exception
- la méthode "public Quote save(Quote quote)" renverra null à cause de la ligne "return null;"
- Maintenant, le code atteint l'intercepteur de transaction et comme il n'y avait pas d'exception au niveau de cet intercepteur, il essaie de s'engager mais la transaction est déjà marquée comme rollback et échoue donc.
Solution :- Vous ne devez pas utiliser l'exception et la propager à la place en raison de votre besoin transactionnel.
Changer pour suivre. ont ajouté l'instruction throw.
try{
quoteLineDao.delete(new Long(44));
System.out.println("°°°°°°°°°°°°°°°°°°Line 44 deleted");
return quoteDao.save(quote);
} catch(Exception e){
Logger.getLogger(QuoteService.class).log(Logger.Level.ERROR, e);
throw e;
}
Une explication étape par étape est disponible dans ce lien :Impossible de valider la transaction JPA :transaction marquée comme rollbackOnly