我们有一个示例应用程序,展示了我们正在做客户端的一些事情。它引入了一些内部库来实现一切功能。它在一些硬编码数据中笨拙,所以它不必关心任何类型的持久性机制。
在其中一些库中,有弹簧数据jpa存储库。像这样:
public interface MyLibraryEntityRepository extends JpaRepository<MyLibraryEntity, Long>
{
//...
}
当服务器启动时,我收到如下错误:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'myLibraryEntityRepository': Cannot create inner bean '(inner bean)#788f64f1' of type [org.springframework.orm.jpa.SharedEntityManagerCreator] while setting bean property 'entityManager'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#788f64f1': Cannot resolve reference to bean 'entityManagerFactory' while setting constructor argument; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'entityManagerFactory' is defined
它无法找到entityManager
,但我想要必须使用entityManager
。因此,在尝试覆盖myLibraryEntityRepository
bean时,我将以下内容添加到我的Java配置中:
@Bean
public MyLibraryEntityRepository getMyLibraryEntityRepository()
{
return myDummyImpl();
}
但是,这会导致相同的错误。
有没有办法可以覆盖spring数据jpa存储库的bean定义,这样我就可以使用自己的虚拟实现,而不必在我的应用程序中配置entityManager
?
答案 0 :(得分:0)
你可以使用@Bean(name =“dummyBean”)和@Autowired中使用注释@Qualifier(“dummyBean”)
答案 1 :(得分:0)
为什么不在内存瞬态数据库h2
上使用创建entityManager
?
这样,在引导应用程序期间,您也可以使用简单的sql脚本加载所有演示数据。
没有硬编码的演示数据。没有修改您的代码。
以下是我的数据库配置的摘录,专门用于我的Spring Data应用程序的集成测试。
@Profile("test")
@Configuration
public class TestDataSourceConfig {
// ... entity Manager
@Bean
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("org.h2.Driver");
dataSource.setUrl("jdbc:h2:mem:test;DB_CLOSE_DELAY=-1");
dataSource.setUsername("");
dataSource.setPassword("");
return dataSource;
}
public JpaVendorAdapter jpaVendorAdapter() {
return new HibernateJpaVendorAdapter() {
{
setDatabasePlatform("org.hibernate.dialect.H2Dialect");
}
};
}
public Properties jpaProperties() {
Properties properties = new Properties();
properties.put("hibernate.hbm2ddl.auto","create");
return properties;
}
@Bean
@DependsOn("entityManagerFactory")
public ResourceDatabasePopulator initDatabase(DataSource dataSource) throws Exception {
ResourceDatabasePopulator populator = new ResourceDatabasePopulator();
populator.addScript(new ClassPathResource("test-data.sql"));
populator.populate(dataSource.getConnection());
return populator;
}
}