Актуализирам отговора си:
- Искате методът ви „public Quote save(Quote quote)“ да бъде транзакционен.
- когато този метод се извика... транзакцията започва в TransactionInterceptor и от проксито се извиква „public Quote save(Quote quote)“
- Ред „quoteLineDao.delete(new Long(44));“ работи добре
- Ред "System.out.println("°°°°°°°°°°°°°°°°° Ред 44 е изтрит");" работи добре
- Ред „quoteDao.save(quote);“ дава изключение за нарушение на ограничението. Транзакцията е маркирана като връщане назад
- вие улавяте това изключение и го консумирате, а не разпространявате изключението
- методът "public Quote save(Quote quote) " ще върне null поради ред "return null;"
- Сега кодът достига до прехващача на транзакции и тъй като нямаше изключение в този прихващач, той се опитва да извърши ангажимент, но транзакцията вече е маркирана като връщане назад и следователно не успява.
Решение:- Не трябва да използвате изключението и вместо това да го разпространявате поради вашите транзакционни нужди.
Промяна на следното. са добавили изявление 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;
}
Обяснението стъпка по стъпка е достъпно на тази връзка:Транзакцията на JPA не можа да се извърши:Транзакцията е маркирана като rollbackOnly