java - 如何处理 Spring 包裹的 hibernate 异常?

标签 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 异常。就像下面这样,为什么?

Could not synchronize database state with session org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect):

最佳答案

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

Spring 文档说:

This exception hierarchy aims to let user code find and handle the kind of error encountered without knowing the details of the particular data access API in use (e.g. JDBC). Thus it is possible to react to an optimistic locking failure without knowing that JDBC is being used.

关于java - 如何处理 Spring 包裹的 hibernate 异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44038222/

相关文章:

java - Java 文件中的 Admob 导致应用程序关闭

java - 无论 Spring 数据源 URL 是在哪里指定的,如何读取它的值?

java - 带有@RequestBody的spring mvc异常处理程序

oracle - 子对象属性的订购

Java - Hibernate 不在选择查询时返回特殊字符

java - 使用 Apache HTTP 服务器提供错误页面

java - 在 Azure 函数(应用服务)中设置初始和最大 JVM 内存?

java - 为什么我们使用 ViewTreeObserver#addOnGlobalLayoutListener()

java - 如何在 JSF 中配置 CSRF 安全

java - Hibernate 不会从集合中删除的对象中删除条目