如何在使用容器管理的事务时处理异常

时间:2018-04-09 14:58:02

标签: hibernate spring-mvc jpa

我的应用程序正在处理Spring MVC框架,我们需要为进程和DAO层实现异常处理。

因此,如果出现任何技术故障,我们需要将响应代码1发送回UI。因此,执行将以下列方式发生。

Json控制器 - >代表层 - >处理层 - >服务层 - > DAO图层

我在我的应用程序中使用JPA将数据保存在数据库中,而我正在使用Container托管的transcation。但是我在DAO Layer上实现异常处理时遇到了以下查询:

  1. 即使我在DAO图层中捕获到异常,JPA会自动回滚事务吗?

  2. 我应该在serviec层上捕获RunTimeException,所以如果DAO Layer出现任何故障,我只能在Service层上设置响应代码1吗?

  3. 我是否需要使用@Transactional Annotation,因为我已经使用@Repository Annotation注释了我的DAO类?

1 个答案:

答案 0 :(得分:1)

  

即使我在DAO Layer中捕获了Exception,JPA会自动回滚事务吗?

不,它不会。应该预测异常,直到春天赶上它。要做到这一点,你必须重新抛出异常,然后spring会抓住它并完成它的工作。

查看@Transactional文档。

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/transaction/annotation/Transactional.html#rollbackFor--

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/transaction/annotation/Transactional.html#noRollbackFor--

  

我应该在服务层上捕获RunTimeException,所以如果DAO Layer出现任何故障,我只能在Service层上设置响应代码1吗?

是。使用@ControllerAdvice,您可以为UI设置适当的响应。例如:重新抛出一个MovieServiceException然后用@ExceptionHandler捕获它并返回一个正确的响应。

我是否需要使用@Transactional Annotation,因为我已经使用@Repository Annotation注释了我的DAO类?

  

您应该在服务层使用@Transactional,因为只设置@Repository不会工作。如果您正在使用Spring Data JPA,您可能会或不会使用@Transactional,这取决于您的情况。

<强>更新

我从DAO层抛出异常,但唯一不同的是我没有抛出原始异常,但我用我的应用程序异常类包装JPA异常并将其抛回Service层。那么在那种情况下还会回滚操作吗?

  

文档说:默认情况下,事务将在RuntimeException和Error上回滚,但不会在已检查的异常(业务例外)上回滚。

     

(我已经看到人们设置@Transactional(rollbackFor = Exception.class)所以这应该适用于第二种情况)

您能否解释一下在使用Spring JPA数据时我们为什么不需要@Transactional Annotation的详细信息?为什么我们在其他情况下需要它?

简单,这是默认行为。您可以在https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#transactions

了解更多相关信息