使用@Transaction
并使用Spring的跟踪级别日志记录,我发现Hibernate在db约束上有一个例外,但它只是回滚事务。我尝试使用@Exception
但未成功尝试捕获它。
我在网上看到一个使用Spring AOP @AfterThrowing
来捕捉此类事件的建议。
这似乎是处理普通事件的一种相当复杂的方式。使用try / catch和旧式提交/回滚似乎更容易。没有更好的方法 在Spring Hibernate中?
我正在处理队列中的XML消息。根据我得到的异常类型,我可能只想捕获它并将错误的传入队列消息放入db错误表并继续事务。 (如果我只是盲目地回滚,那么消息会被放回到队列中,这在某些情况下可能会很好,但在其他情况下则不然。)
从我读过的内容可以看出一些错误(出于某种原因不是约束错误)并记录它们。有没有办法在异常后中断事务并决定是否要提交,继续或回滚?
如果没有,可以使用旧式提交和使用spring hibernate回滚吗?
答案 0 :(得分:1)
配置SimpleMappingException
解析程序并在那里记录异常:
public class MyExceptionResolver extends SimpleMappingExceptionResolver {
private Logger logger = LoggerFactory.getLogger(MyExceptionResolver .class);
@Override
protected void logException(Exception ex, HttpServletRequest request) {
this.logger.warn(buildLogMessage(ex, request), ex);
}
<bean class="com.mypackage.MyExceptionResolver"/>
修改强>
您可以选择做任何事情。上述类与回滚无关。截取异常并随意执行任何操作都很有用。
默认情况下,Spring会回滚任何RuntimeException
。
如果要配置回滚策略:
@Transactional(rollbackFor = { CustomException.class})
或
@Transactional(noRollBackFor= { CustomException.class})