使用HibernateDaoSupport时处理异常

时间:2012-08-24 10:14:17

标签: spring hibernate exception-handling

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

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

2 个答案:

答案 0 :(得分:2)

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

  • 您希望从中恢复的例外情况(例如,如果您尝试插入的记录已存在,则为DuplicateKeyException;如果存在违反的数据库约束,则为DataIntegrityViolationException用户输入的结果)
  • 您无法恢复的例外情况(数据库已关闭)

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

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

那我该做什么:

try {
   getHibernateTemplate().save(object);
} catch (DataIntegrityViolationException dive) {
   throw new BusinessValidationException(dive, "You've got the data wrong");
}

答案 1 :(得分:0)

Spring异常层次结构为well documented.

如果您遇到数据访问异常通常不会做太多,因为在工作系统中,这可能是由于DB服务器上磁盘空间不足或网络连接问题等原因造成的。 通常需要尽快记录和调查此类例外情况。

有一些可恢复的错误,可以使用spring异常层次结构处理它们,但是在开发阶段应该避免使用大多数错误,因此您的Web服务器应该在它进入db之前验证尽可能多的东西。< / p>

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