Uppdaterar mitt svar:
- Du vill att din "public Quote save(Quote quote)"-metod ska vara transaktionsbaserad.
- när denna metod anropas ... börjar transaktionen i TransactionInterceptor och från proxyn anropas "public Quote save(Quote quote)"
- Rad "quoteLineDao.delete(new Long(44));" fungerar bra
- Rad "System.out.println("°°°°°°°°°°°°°°°°°°°°rad rad 44 raderad");" fungerar bra
- Rad "quoteDao.save(quote);" ger begränsningsöverträdelse undantag. Transaktionen är markerad som återställning
- du fångar detta undantag och konsumerar det och sprider inte undantaget
- metoden "public Quote save(Quote quote) " returnerar null på grund av raden "return null;"
- Nu når koden transaktionsinterceptor och eftersom det inte fanns något undantag vid denna interceptor, försöker den utföra men transaktionen är redan markerad som rollback och misslyckas därför.
Lösning:- Du får inte konsumera undantaget och istället sprida undantaget på grund av ditt transaktionsbehov.
Ändra till följande. har lagt till throw-sats.
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;
}
Steg för steg förklaring finns på denna länk:Det gick inte att genomföra JPA-transaktionen:Transaktionen markerad som rollbackOnly