11.2.3. 异常处理
如果 Session
抛出异常 (包括任何SQLException
), 你应该立即回滚数据库事务,调用 Session.close()
,丢弃该 Session
实例。Session
的某些方法可能会导致session 处于不一致的状态。所有由Hibernate抛出的异常都视为不可以恢复的。确保在 finally
代码块中调用close()
方法,以关闭掉 Session
。
HibernateException
是一个非检查期异常(这不同于Hibernate老的版本), 它封装了Hibernate持久层可能出现的大多数错误。我们的观点是,不应该强迫应用程序开发人员 在底层捕获无法恢复的异常。在大多数软件系统中,非检查期异常和致命异常都是在相应方法调用 的堆栈的顶层被处理的(也就是说,在软件上面的逻辑层),并且提供一个错误信息给应用软件的用户 (或者采取其他某些相应的操作)。请注意,Hibernate也有可能抛出其他并不属于 HibernateException
的非检查期异常。这些异常同样也是无法恢复的,应该 采取某些相应的操作去处理。
在和数据库进行交互时,Hibernate把捕获的SQLException
封装为Hibernate的 JDBCException
。事实上,Hibernate尝试把异常转换为更有实际含义 的JDBCException
异常的子类。底层的SQLException
可以 通过JDBCException.getCause()
来得到。Hibernate通过使用关联到 SessionFactory
上的SQLExceptionConverter
来 把SQLException
转换为一个对应的JDBCException
异常的子类。默认情况下,SQLExceptionConverter
可以通过配置dialect 选项指定;此外,也可以使用用户自定义的实现类(参考javadocs SQLExceptionConverterFactory
类来了解详情)。标准的 JDBCException
子类型是:
JDBCConnectionException
- 指明底层的JDBC通讯出现错误SQLGrammarException
- 指明发送的SQL语句的语法或者格式错误ConstraintViolationException
- 指明某种类型的约束违例错误LockAcquisitionException
- 指明了在执行请求操作时,获取 所需的锁级别时出现的错误。GenericJDBCException
- 不属于任何其他种类的原生异常