我正在使用Spring-Data,并希望将PersistenceExceptions
转换为Springs DataAccessExceptions
。
我用@EnableJpaRepositories
激活了Spring-Data,我可以看到Spring在启动时加载了org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor#0
。 PersistenceExceptionTranslator
也可用。
据我所知,documentation命名空间声明<jpa:repositories>
激活了使用@Repository
注释的Bean的持久性异常转换。这是Java配置(@EnableJpaRepositories
)的情况吗?
这是否意味着,我必须使用@Repository
注释我的Spring-Data存储库接口,或者使用如上所述配置的Spring Data是否可选?
这是界面:
@Repository
public interface DemoDao extends JpaRepository<Demo, Long> {}
这是测试:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {TestDaoWithEmbeddedDatabaseConfiguration.class})
@Transactional
public class DemoTest {
@Test(expected = DataAccessException.class)
public void testFindByTransactionStatus() throws Exception {
persistDemoDataWithUniqueConstraintError(); // this calls DemoDao#save()
}
}
这会产生:
javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException
我无法弄清楚如何启用异常转换。有什么想法吗?
修改1:
这是测试配置和Spring设置:
@Configuration
@ComponentScan("com.demo.dao")
@EnableJpaRepositories("com.demo.dao")
@EnableTransactionManagement
public class TestDaoWithEmbeddedDatabaseConfiguration {
// DataSource (EmbeddedDatabaseBuilder), EntityManagerFactory @Bean configuration
@Bean
public PersistenceExceptionTranslator persistenceExceptionTranslator() {
return new HibernateExceptionTranslator();
}
}
答案 0 :(得分:0)
我使用Spring 4.1.5.RELEASE和Spring Data JPA 1.7.2.RELEASE发现持久性异常转换是默认的。
Per PersistenceExceptionTranslationPostProcessor javadoc:
所有Spring的适用资源工厂(例如 LocalContainerEntityManagerFactoryBean)实现 PersistenceExceptionTranslator接口开箱即用。
我的配置......
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef="emfb", ...)
@ComponentScan(...)
public class TestConfig {
@Bean public LocalContainerEntityManagerFactoryBean emfb() { ... }
...
}
......和JUnit4测试一样......
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes={TestConfig.class})
public class MyTest {
...
@Test public void expectFKViolation() { ... }
...
}
...导致:
Tests in error: expectFKViolation(...): ...; nested exception is org.hibernate.PropertyValueException
为org.hibernate.PropertyValueException
:
o.s.t.c.s.DirtiesContextTestExecutionListener - After test method:
context [ ..., testException = org.springframework.dao.DataIntegrityViolationException:
not-null ...; nested exception is org.hibernate.PropertyValueException ... ]
在测试方法上设置已翻译的testException类型会使测试变为绿色:
@Test(expected="org.springframework.dao.DataIntegrityViolationException.class")
public void expectFKViolation() { ... }