Aktualisieren meiner Antwort:
- Sie möchten, dass Ihre Methode "öffentliches Angebot speichern (Angebotsangebot)" transaktional ist.
- wenn diese Methode aufgerufen wird ... beginnt die Transaktion im TransactionInterceptor und vom Proxy wird "public Quote save(Quote quote)" aufgerufen
- Zeile "quoteLineDao.delete(new Long(44));" funktioniert gut
- Zeile "System.out.println("°°°°°°°°°°°°°°°°°°°Zeile 44 gelöscht");" funktioniert gut
- Zeile "quoteDao.save(quote);" gibt eine Einschränkungsverletzungsausnahme. Transaktion wird als Rollback markiert
- Sie fangen diese Ausnahme ab und verwenden sie und geben die Ausnahme nicht weiter
- Methode "public Quote save(Quote quote) " gibt wegen der Zeile "return null;" null zurück
- Jetzt erreicht der Code den Transaktions-Interceptor und da es bei diesem Interceptor keine Ausnahme gab, versucht er zu committen, aber die Transaktion ist bereits als Rollback markiert und schlägt daher fehl.
Lösung:- Sie dürfen die Ausnahme nicht verbrauchen und stattdessen die Ausnahme aufgrund Ihrer Transaktionsanforderungen weitergeben.
Wechseln Sie zu Folgendem. habe Throw-Anweisung hinzugefügt.
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;
}
Eine schrittweise Erklärung finden Sie unter diesem Link:JPA-Transaktion konnte nicht festgeschrieben werden:Transaktion als rollbackOnly markiert