Aggiornando la mia risposta:
- Vuoi che il tuo metodo "Salva preventivo pubblico(Quote quote)" sia transazionale.
- quando viene invocato questo metodo ... la transazione inizia in TransactionInterceptor e dal proxy viene invocato "public Quote save(Quote quote)"
- Riga "quoteLineDao.delete(new Long(44));" funziona bene
- Riga "System.out.println("°°°°°°°°°°°°°°°°°°°Riga 44 eliminata");" funziona bene
- Riga "quoteDao.save(quote);" fornisce un'eccezione per la violazione dei vincoli. La transazione è contrassegnata come rollback
- stai rilevando questa eccezione e la stai consumando senza propagare l'eccezione
- il metodo "public Quote save(Quote quote)" restituirà null a causa della riga "return null;"
- Ora il codice raggiunge l'intercettore di transazione e poiché non c'erano eccezioni in questo intercettore, tenta di eseguire il commit ma la transazione è già contrassegnata come rollback e pertanto non riesce.
Soluzione:- non devi utilizzare l'eccezione e invece propagare l'eccezione a causa della tua necessità transazionale.
Passa a seguire. hanno aggiunto la dichiarazione 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;
}
La spiegazione passo passo è disponibile a questo link:Impossibile eseguire il commit della transazione JPA:transazione contrassegnata come rollbackOnly