我的应用程序正在处理Spring MVC框架,我们需要为进程和DAO层实现异常处理。
因此,如果出现任何技术故障,我们需要将响应代码1发送回UI。因此,执行将以下列方式发生。
Json控制器 - >代表层 - >处理层 - >服务层 - > DAO图层
我在我的应用程序中使用JPA将数据保存在数据库中,而我正在使用Container托管的transcation。但是我在DAO Layer上实现异常处理时遇到了以下查询:
即使我在DAO图层中捕获到异常,JPA会自动回滚事务吗?
我应该在serviec层上捕获RunTimeException,所以如果DAO Layer出现任何故障,我只能在Service层上设置响应代码1吗?
我是否需要使用@Transactional Annotation,因为我已经使用@Repository Annotation注释了我的DAO类?
答案 0 :(得分:1)
不,它不会。应该预测异常,直到春天赶上它。要做到这一点,你必须重新抛出异常,然后spring会抓住它并完成它的工作。即使我在DAO Layer中捕获了Exception,JPA会自动回滚事务吗?
查看@Transactional文档。
我应该在服务层上捕获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
了解更多相关信息