2014-01-15 112 views
0

With @Transaction和Spring的跟踪级别日志记录我发现Hibernate在db约束上有一个异常,但它只是回退事务。我尝试使用@Exception没有成功,试图抓住它。Spring Hibernate吃异常

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

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

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

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

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

+0

这不是吃它处理它的例外。吃东西会很有吸引力,不会回滚。 –

+0

通过吃饭我的意思是在处理后不会抛出另一个异常。它应该抛出一个Hibernate运行时异常(Exception的子类),但是当我使用@Exception时,什么都不会被捕获。我想知道异常,并根据其类型更改处理。 – user1069528

+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}) 
+0

谢谢,但我也想决定提交还是回滚;不只是记录异常。 – user1069528

+0

我编辑了我的答案,看看。 – isah

+0

谢谢,应该这样做。 – user1069528