如何处理spring包装的hibernate异常?

时间:2017-05-18 03:43:05

标签: java spring hibernate spring-mvc

spring模板会将hibernate异常包装到DataAccessExceptions中。所以试图直接捕获hibernate异常不会起作用。像这样

try{
    springdao.update(row)
}
catch(HibernateException e) {
    //won't do 
}

的问题:

  1. 捕获DataAccessException包装hibernate异常的最佳做法是什么?只是catch(DataAccessException)

  2. 即使spring被抛出也包裹了异常。它表现为原始的hibernate异常。如下,为什么?

  3.   

    无法将数据库状态与会话同步   org.hibernate.StaleObjectStateException:行已更新或删除   另一个事务(或unsaved-value映射不正确):

1 个答案:

答案 0 :(得分:1)

我认为最好处理DataAccessException而不是HibernateExceptionSQLException。因为它以更一般化的方式描述了这个问题。如果您以后更改ORM /数据库,它将以相同的方式处理与数据库相关的异常处理。它也包含与Hibernate相同的异常。即使在非SQL数据库的情况下,也会抛出相同的异常

Spring文档说:

  

此异常层次结构旨在让用户代码查找和处理   在不知道细节的情况下遇到的那种错误   正在使用的特定数据访问API(例如JDBC)。因此有可能   在不知道JDBC的情况下对乐观锁定失败作出反应   被使用。