Aktualizace mé odpovědi:
- Chcete, aby vaše metoda „uložení veřejné nabídky (nabídka cenové nabídky)“ byla transakční.
- když je tato metoda vyvolána ... transakce začíná v TransactionInterceptor az proxy je vyvoláno "veřejné uložení nabídky (nabídka cenové nabídky)"
- Řádek "quoteLineDao.delete(new Long(44));" funguje dobře
- Řádek "System.out.println("°°°°°°°°°°°°°°°°°°Řádek 44 odstraněn");" funguje dobře
- Řádek "quoteDao.save(quote);" dává výjimku porušení omezení. Transakce je označena jako rollback
- tuto výjimku zachycujete a využíváte a nešíříte výjimku
- Metoda "public Quote save(Citát citace) " vrátí hodnotu null kvůli řádku "return null;"
- Nyní kód dosáhne zachycovače transakcí, a protože u tohoto zachycovače nebyla žádná výjimka, pokusí se potvrdit, ale transakce je již označena jako vrácení zpět, a proto se nezdaří.
Řešení:- Výjimku nesmíte využívat a místo toho ji šířit kvůli vaší transakční potřebě.
Změnit na sledování. přidali příkaz 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;
}
Vysvětlení krok za krokem je k dispozici na tomto odkazu:Nelze potvrdit transakci JPA:Transakce označená jako rollbackOnly