spring模板会将hibernate异常包装到DataAccessExceptions
中。所以试图直接捕获hibernate异常不会起作用。像这样
try{
springdao.update(row)
}
catch(HibernateException e) {
//won't do
}
的问题:
捕获DataAccessException包装hibernate异常的最佳做法是什么?只是catch(DataAccessException)
?
即使spring被抛出也包裹了异常。它表现为原始的hibernate异常。如下,为什么?
无法将数据库状态与会话同步 org.hibernate.StaleObjectStateException:行已更新或删除 另一个事务(或unsaved-value映射不正确):
答案 0 :(得分:1)
我认为最好处理DataAccessException
而不是HibernateException
或SQLException
。因为它以更一般化的方式描述了这个问题。如果您以后更改ORM /数据库,它将以相同的方式处理与数据库相关的异常处理。它也包含与Hibernate相同的异常。即使在非SQL数据库的情况下,也会抛出相同的异常
Spring文档说:
此异常层次结构旨在让用户代码查找和处理 在不知道细节的情况下遇到的那种错误 正在使用的特定数据访问API(例如JDBC)。因此有可能 在不知道JDBC的情况下对乐观锁定失败作出反应 被使用。