confirmar alterações no try-catch dentro do @Transactional
Considere que eu tenho um método para fazer algumas coisas e mecanismo de log no estilo de padrão ActiveRecord:
@Transactional
public void doSmt() {
try {
someOperation(); // can throw exception
Logger.logIntoDb(); // if everything is OK
} catch {Exception e} {
Logger.logIntoDbWithException(e.getMessage()); // log error into db
throw new MyCustomException(e);
}
}
public static void logIntoDbWithException(String message) {
final LogEntry logEntry = new LogEntry();
logEntry.setDate(new Date());
logEntry.setMessage(message);
logEntry.persist();
}
Quero persistir uma mensagem de erro em caso de falha, mas se eu repetir a exceção na transação da cláusula catch, será revertida e meu LogEntry não será persistido. A única maneira que vejo é ligar manualmenteflush()
depois depersist()
.
Existe uma solução mais limpa para fazer isso?
Obrigado.
UPD:
Como eu tenho um método estático que executa persistentemente, preciso aplicar o seguinte hack para a resposta aceita:
public static void logIntoDbWithException(String message) {
new Runnable() {
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void run() {
final LogEntry logEntry = new LogEntry();
logEntry.setDate(new Date());
logEntry.setMessage(message);
logEntry.persist();
}
}.run();
}