ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# 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` - 不属于任何其他种类的原生异常