新的 org.springframework.orm.hibernate5.HibernateExceptionTranslator
使用 fallthrough,因为它首先尝试使用 vanilla Hibernate (SessionFactoryUtils
) 映射异常。如果无法完成转换,它会通过 EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible()
尝试 JPA。
后者困扰我们,因为它将 IllegalStateException
转换为 InvalidDataAccessApiUsageException
。我不太确定为什么 IllegalStateException
和 IllegalArgumentException
得到这种特殊待遇,但没关系。所以现在我们突然结束了以前没有翻译的翻译异常。由于这些额外的翻译是在 JPA 的上下文中(因为它被称为 convertJpaAccessExceptionIfPossible
),这也没有意义,因为我们没有使用 JPA,而是使用普通的 Hibernate。
那么,确保我们只翻译 Hibernate 异常的正确方法是什么? Afaic HibernateExceptionTranslator
没有关闭 JPA 翻译的选项,LocalSessionFactoryBean
扩展了 HibernateExceptionTranslator
而没有注入(inject)另一个实现的选项。让 HibernateExceptionTranslator
JPA 不知道并添加另一个翻译器以防实际使用 JPA 不是更有意义吗?
最佳答案
来自 Spring Data reference :
Using this element looks up Spring Data repositories as described in Creating repository instances. Beyond that it activates persistence exception translation for all beans annotated with @Repository to let exceptions being thrown by the JPA persistence providers be converted into Spring’s DataAccessException hierarchy.
省略 @Repository 注释,然后普通的 Hibernate 异常将不会被翻译。
关于java - 如何停用 Spring Data 异常转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39393116/