【问题标题】:Spring Hibernate eats exceptionsSpring Hibernate 吃异常
【发布时间】:2014-01-15 21:33:55
【问题描述】:

使用@Transaction 和 Spring 的跟踪级别日志记录,我看到 Hibernate 在 db 约束上有一个异常,但它只是回滚事务。我尝试使用@Exception 尝试捕捉它,但没有成功。

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

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

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

根据我的阅读,有一些方法可以让您了解一些错误(由于某种原因不是约束错误)并记录它们。有没有办法在异常发生后中断事务并决定是否要提交、继续或回滚?

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

【问题讨论】:

  • 它没有吃掉它正在处理的异常。吃东西会赶上而不是回滚。
  • 吃我的意思是在处理后不抛出另一个异常。它应该抛出一个 Hibernate 运行时异常(异常的子类),但是当我使用 @Exception 时,什么都没有被捕获。我想了解异常并根据其类型更改处理。
  • 他们似乎选择了通知模型。我个人不会对“有一个例外所以我回滚”感到不舒服。洒出来的牛奶当时已经被扫到地毯下面了。

标签: spring hibernate transactions


【解决方案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})

【讨论】:

  • 谢谢,但我也想决定是提交还是回滚;不仅仅是记录异常。
  • 谢谢,应该这样做。
猜你喜欢
  • 2019-05-03
  • 2014-07-27
  • 1970-01-01
  • 2018-07-31
  • 2013-05-12
  • 2018-10-19
  • 1970-01-01
  • 1970-01-01
  • 2010-10-05
相关资源
最近更新 更多