【发布时间】:2016-08-22 20:21:24
【问题描述】:
考虑一下我有一个方法在 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 将不会被保留。我看到的唯一方法是在persist() 之后手动调用flush()。
是否有更干净的解决方案来执行此操作?
谢谢。
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();
}
【问题讨论】:
-
尝试将其分成两个事务。下面的链接也有同样的答案。 Check here
标签: java spring hibernate jpa jdbc