私の答えを更新する:
- 「publicQuotesave(Quotequote)」メソッドをトランザクション型にする必要があります。
- このメソッドが呼び出されると...トランザクションはTransactionInterceptorで開始され、プロキシから「public Quote save(Quotequote)」が呼び出されます
- 行"quoteLineDao.delete(new Long(44));"正常に動作します
- 行"System.out.println("°°°°°°°°°°°°°°°°°°行44が削除されました ");"正常に動作します
- 行"quoteDao.save(quote);"制約違反の例外を与えます。トランザクションはロールバックとしてマークされます
- この例外をキャッチして消費し、例外を伝播していません
- メソッド"publicQuote save(Quote quote)"は、 "return null;"という行があるため、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としてマークされています