зафиксировать изменения в try-catch внутри @Transactional
Предположим, у меня есть метод, выполняющий некоторые вещи и механизм регистрации в стиле шаблона 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();
}
Я хочу сохранить сообщение об ошибке в случае сбоя, но если я переброшу исключение в транзакции предложения catch, будет выполнен откат, и мой LogEntry не будет сохранен. Я вижу только вручнуюflush()
послеpersist()
.
Есть ли более чистое решение для этого?
Благодарю.
UPD:
Поскольку у меня есть статический метод, который выполняет сохранение, мне нужно применить следующий хак к принятому ответу:
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();
}