Änderungen in try-catch in @ Transactional @ festschreib
Consider Ich habe eine Methode, die einiges erledigt und Mechanismen zur Protokollierung im ActiveRecord-Musterstil verwendet:
@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();
}
Ich möchte eine Fehlermeldung im Fehlerfall beibehalten, aber wenn ich eine Ausnahme in der Catch-Klausel-Transaktion erneut auslösen würde, wird ein Rollback ausgeführt und mein LogEntry wird nicht beibehalten. Die einzige Möglichkeit, die ich sehe, ist das manuelle Anrufen vonflush()
nachpersist()
.
Gibt es eine sauberere Lösung, um dies durchzuführen?
Vielen Dank
UPD:
Da ich über eine statische Methode verfüge, die dauerhaft funktioniert, muss ich folgenden Hack auf die akzeptierte Antwort anwenden:
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();
}