Atualizando minha resposta:
- Você deseja que seu método "public Quote save(Cotação de cotação)" seja transacional.
- quando este método é invocado... a transação começa no TransactionInterceptor e do proxy "public Quote save(Quote quote)" é invocado
- Linha "quoteLineDao.delete(new Long(44));" funciona bem
- Linha "System.out.println("°°°°°°°°°°°°°°°°°Linha 44 excluída");" funciona bem
- Linha "quoteDao.save(quote);" dá exceção de violação de restrição. A transação está marcada como reversão
- você está pegando essa exceção e consumindo-a e não propagando a exceção
- método "public Quote save(quote quote) " retornará nulo devido à linha "return null;"
- Agora o código chega ao interceptor da transação e, como não houve exceção neste interceptor, ele tenta confirmar, mas a transação já está marcada como rollback e, portanto, falha.
Solução:- Você não deve consumir a exceção e, em vez disso, propagar a exceção devido à sua necessidade transacional.
Mude para o seguinte. adicionaram a instrução 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;
}
A explicação passo a passo está disponível neste link:Não foi possível confirmar a transação JPA:Transação marcada como rollbackOnly