【发布时间】:2014-12-13 16:25:16
【问题描述】:
我正在使用 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 方法中刷新休眠会话,但我不喜欢这种方法。有没有更好的方法来解决这个问题?
【问题讨论】:
-
你可以使用 AOP 拦截器,但是为什么呢? DataAccessException 有什么问题? Spring 已经提供了一个异常层次结构,可以将您与持久性框架特定的异常类型隔离开来。为什么还要在此之上再添加一个异常层次结构?
-
我想向用户提供自定义消息。不是春天给的。除了 AOP 抛出建议之外,您还有其他选择吗?
-
那你为什么不在 UI 层捕获 DataException 呢?显示错误消息不是服务层的工作。
-
我的表示层不应该知道数据库和其他东西。因此我的设计在表示层中没有这样的逻辑。我的观点是服务层应该完成所有工作。
标签: spring hibernate exception-handling transactional