Spring Hibernate吃异常

时间:2014-01-15 21:33:56

标签: spring hibernate transactions

使用@Transaction并使用Spring的跟踪级别日志记录,我发现Hibernate在db约束上有一个例外,但它只是回滚事务。我尝试使用@Exception但未成功尝试捕获它。

我在网上看到一个使用Spring AOP @AfterThrowing来捕捉此类事件的建议。

这似乎是处理普通事件的一种相当复杂的方式。使用try / catch和旧式提交/回滚似乎更容易。没有更好的方法 在Spring Hibernate中?

我正在处理队列中的XML消息。根据我得到的异常类型,我可能只想捕获它并将错误的传入队列消息放入db错误表并继续事务。 (如果我只是盲目地回滚,那么消息会被放回到队列中,这在某些情况下可能会很好,但在其他情况下则不然。)

从我读过的内容可以看出一些错误(出于某种原因不是约束错误)并记录它们。有没有办法在异常后中断事务并决定是否要提交,继续或回滚?

如果没有,可以使用旧式提交和使用spring hibernate回滚吗?

1 个答案:

答案 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})