Actualizando mi respuesta:
- Quiere que su método "public Quote save(Quote quote)" sea transaccional.
- cuando se invoca este método... la transacción comienza en TransactionInterceptor y desde el proxy se invoca "public Quote save(Quote quote)"
- Línea "quoteLineDao.delete(new Long(44));" funciona bien
- Línea "System.out.println("°°°°°°°°°°°°°°°°°°Línea 44 eliminada");" funciona bien
- Línea "quoteDao.save(quote);" da una excepción de violación de restricción. La transacción está marcada como retroactiva
- está capturando esta excepción y consumiéndola y no propagando la excepción
- método "public Quote save(Quote quote)" devolverá nulo debido a la línea "return null;"
- Ahora el código llega al interceptor de transacciones y, como no hubo ninguna excepción en este interceptor, intenta confirmar, pero la transacción ya está marcada como reversión y, por lo tanto, falla.
Solución:- No debe consumir la excepción y, en su lugar, propagar la excepción debido a su necesidad transaccional.
Cambiar a siguiente. han agregado la instrucción 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;
}
La explicación paso a paso está disponible en este enlace:No se pudo confirmar la transacción JPA:Transacción marcada como rollbackOnly