新org.springframework.orm.hibernate5.HibernateExceptionTranslator
在使用vanilla Hibernate(SessionFactoryUtils
)首次尝试映射异常的意义上使用了一个漏洞。如果无法进行翻译,则通过EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible()
尝试JPA。
后者使我们感到困扰,因为它正在将IllegalStateException
翻译为InvalidDataAccessApiUsageException
。我不确定为什么IllegalStateException
和IllegalArgumentException
会得到这种特殊待遇,但还可以。所以现在我们突然结束了以前没有翻译的翻译异常。由于这些额外的翻译是在JPA的上下文中(因为它被称为convertJpaAccessExceptionIfPossible
),这也没有意义,因为我们没有使用JPA而是使用vanilla Hibernate。
那么,确保我们只获得翻译的Hibernate异常的正确方法是什么?虽然HibernateExceptionTranslator
没有选项可以关闭JPA翻译而LocalSessionFactoryBean
扩展HibernateExceptionTranslator
但没有注入其他实现的选项。让HibernateExceptionTranslator
JPA不知道并且在实际使用JPA的情况下添加另一个翻译器会更有意义吗?
答案 0 :(得分:1)
来自Spring Data reference:
使用此元素查找Spring Data存储库,如中所述 创建存储库实例。除此之外,它激活了持久性 使用@Repository注释的所有bean的异常转换 JPA持久性提供程序抛出的异常将被转换 进入Spring的DataAccessException层次结构。
省略@Repository注释,然后vanilla Hibernate异常不会被翻译。
答案 1 :(得分:0)
请参阅https://jira.spring.io/browse/SPR-14681了解相应的答案