cometer cambios en try-catch dentro de @Transactional
Considere que tengo un método que hace algunas cosas y un mecanismo de registro en el estilo de patrón 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();
}
Quiero persistir un mensaje de error en caso de falla, pero si volviera a lanzar la excepción en la cláusula catch, la transacción se revertirá y mi LogEntry no se mantendrá. La única forma en que veo es llamar manualmenteflush()
despuéspersist()
.
¿Existe una solución más limpia para realizar esto?
Gracias.
UPD:
Dado que tengo un método estático que realiza persistencia, necesito aplicar el siguiente truco a la respuesta aceptada:
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();
}