有没有办法覆盖spring数据jpa存储库的bean定义?

时间:2014-11-12 20:06:30

标签: java spring spring-data-jpa

我们有一个示例应用程序,展示了我们正在做客户端的一些事情。它引入了一些内部库来实现一切功能。它在一些硬编码数据中笨拙,所以它不必关心任何类型的持久性机制。

在其中一些库中,有弹簧数据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

2 个答案:

答案 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;
    }
}