1

我在我的应用程序中使用 Spring Hibernate 集成,并且 DAO 类正在扩展HibernateDaoSupport
假设我使用代码保存了一些对象, getHibernateTemplate().save(object); 因为 Spring Hibernate 集成不要求编写 try-catch 块,但假设在保存该对象时是否发生任何异常。那么最好的处理方法是什么?我的意思是我应该在服务层中捕获它并将其包装在一些用户定义的异常中。如果我想记录 DAO 中的哪个方法引发异常,是否需要在 DAO 层方法本身中编写 try-catch?

在对异常处理一无所知之前,我从未使用过 HibernateDaoSupport 或 Hibernate Template。请向我提供您的宝贵意见

4

2 回答 2

2

Spring使用背后的想法RuntimeException是通常有不同类型的异常:

  • 您要从中恢复的异常(例如,如果您尝试插入的记录已经存在,则为 DuplicateKeyException;如果由于用户输入而违反了 DB 约束,则为更一般DataIntegrityViolationException
  • 无法恢复的异常(数据库已关闭)

对于第一种情况,您可以很好地处理异常(或者通过自定义业务异常,以便视图层可以重定向到输入页面并提供有意义的消息)

对于第二种情况,让异常冒泡并由通用异常处理程序处理会更容易,然后向用户显示通用错误页面。对于这种情况,将异常包装在自定义异常中是没有意义的,因为您将无法恢复。炸毁的数据库往往是致命的。

所以我会做什么:

try {
   getHibernateTemplate().save(object);
} catch (DataIntegrityViolationException dive) {
   throw new BusinessValidationException(dive, "You've got the data wrong");
}
于 2012-08-24T10:36:14.827 回答
0

Spring 异常层次结构有据可查。

通常如果遇到数据访问异常,你也无能为力,因为在工作系统中,这可能是由于数据库服务器磁盘空间不足,或者网络连接问题等造成的。此类异常通常需要记录和调查尽快地。

有一些可恢复的错误,它们可以用 spring 异常层次结构处理,但恕我直言,在开发阶段应该避免大多数错误,所以你的 web 服务器应该在它进入数据库之前验证尽可能多的东西。

如果要设置异常日志记录,请参阅类似问题:

于 2012-08-24T10:45:37.310 回答