Aktualizuję moją odpowiedź:
- Chcesz, aby metoda „zapisywania wyceny publicznej (wycena)” była transakcyjna.
- kiedy ta metoda jest wywoływana ... transakcja rozpoczyna się w TransactionInterceptor i z proxy wywoływana jest „publiczna oferta zapisywania (cytat z wyceną)”
- Wiersz "quoteLineDao.delete(new Long(44));" działa dobrze
- Wiersz „System.out.println”(„°°°°°°°°°°°°°°°°°° Wiersz 44 usunięty”);” działa dobrze
- Wiersz "quoteDao.save(quote);" daje wyjątek naruszenia ograniczenia. Transakcja jest oznaczona jako wycofanie
- łapiesz ten wyjątek i zużywasz go, a nie propagujesz wyjątku
- metoda „public Quote save(Quote quote)” zwróci wartość null z powodu wiersza „return null;”
- Teraz kod dociera do przechwytywacza transakcji i ponieważ nie było wyjątku w tym przechwytywaczu, próbuje zatwierdzić, ale transakcja jest już oznaczona jako wycofanie i dlatego kończy się niepowodzeniem.
Rozwiązanie:- Nie wolno wykorzystywać wyjątku i zamiast tego propagować wyjątek ze względu na potrzeby transakcyjne.
Zmień na następujące. dodano instrukcję 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;
}
Wyjaśnienie krok po kroku jest dostępne pod tym linkiem:Nie można zatwierdzić transakcji JPA:Transakcja oznaczona jako rollbackOnly