我正在使用spring + hibernate开发web应用程序。据我所知,最好将@transactional放在服务层中。在将数据更新到数据库时,如果出现任何异常,Spring会抛出DataAccessException。
以下是我的高级班级结构。
@Transactional
class OrderService {
public void createOrder() {
try {
orderDAO.createOrder();
} catch (DataAccessException e) {
// convert into business exception and sends back to presentation logic.
}
}
}
这里发生的是仅在方法完成后抛出数据访问异常。因此,如果发生任何异常,我无法将其转换为catch块中的业务异常。
解决方法是在dao方法中刷新hibernate会话,但我不喜欢这种方法。有没有更好的方法呢?
答案 0 :(得分:1)
我认为您使用的是Spring MVC,尽管您没有指定。如果您使用的是Spring MVC,那么有几个不同的选项。
您也可以阅读Exception Handling in Spring MVC了解更多详情。
一般来说,我发现最好的解决方案是在更高级别捕获事务异常并操纵信息以后端不可知的方式将其呈现给前端。这允许您设置自己的错误代码/等。我在服务中尝试/捕获异常的唯一一次是,如果我真的想尝试重试或根据某些特定异常修改逻辑流程,并且不希望前端知道它。