PersistenceExceptionTranslationPostProcessor是仅用于JPA实现还是与Spring的JdbcTemplate一起使用它?
如果需要两个数据源,每个数据源都有自己的JPA实体管理器和事务管理器,我是否还需要为整个应用程序指定一个PersistenceExceptionTranslationPostProcessor?
答案 0 :(得分:2)
是的,可以通过在上下文中定义异常转换bean后处理器bean,将Spring异常转换机制透明地应用于所有使用@Repository
注释的bean:
<bean id="persistenceExceptionTranslationPostProcessor"
class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />
根据doc
Bean后处理器,它自动将持久性异常转换应用于标记有Spring的@Repository的任何bean 注释,添加相应的 PersistenceExceptionTranslationAdvisor到公开的代理(一个 现有的AOP代理或新生成的代理,实现所有 目标的接口)。
将本机资源异常转换为Spring的DataAccessException层次结构。自动检测实现的bean PersistenceExceptionTranslator接口,随后被询问 翻译候选人例外。 所有Spring的适用资源工厂(例如LocalContainerEntityManagerFactoryBean)都实现了 PersistenceExceptionTranslator接口开箱即用。作为一个 结果,启用自动异常通常需要的一切 翻译正在标记所有受影响的bean(例如存储库或 DAO)与@Repository注释,以及定义它 后处理器作为应用程序上下文中的bean。
因此,您可以将它与Jdbctemplate以及任何Jpa供应商实现一起使用
根据文档All of Spring's applicable resource factories (e.g. LocalContainerEntityManagerFactoryBean) implement the PersistenceExceptionTranslator interface out of the box
,我认为您仍然需要使用PersistenceExceptionTranslationPostProcessor,因为它用于将持久化过程中生成的所有错误(HibernateExceptions,PersistenceExceptions ...)转换为DataAccessException对象。
答案 1 :(得分:2)
自动奖励赏金错误
~~~正确答案如下~~~
我相信我在这里找到了答案: http://www.deroneriksson.com/tutorials/java/spring/introduction-to-the-spring-framework/component-scanning-and-repository
在将异常转换为基于Spring的未经检查的异常时,@ Repository注释可以发挥特殊作用。回想一下,JdbcTemplate为我们处理了这个任务。当我们使用Hibernate时,我们不会使用Spring模板来处理基于Hibernate的异常转换为基于Spring的异常。因此,为了自动处理这种转换,使用@Repository注释的Hibernate DAO将使用PersistenceExceptionTranslationPostProcessor将其Hibernate异常作为Spring异常重新抛出。
上面的段落明确指出: 回想一下,JdbcTemplate为我们处理了这项任务
所以,回答我自己的问题,没有必要将PersistenceExceptionTranslationPostProcessor与jdbcTemplate一起使用