如何在Liquibase bean之后创建Hibernate的EntityManagerFactory,而不覆盖Spring-Boot的EntityManagerFactory bean?

时间:2019-10-04 10:31:48

标签: java hibernate spring-boot liquibase

我想使bean依赖于另一个bean,但是不需要再次重新定义它,因为我已经从Spring Boot自动配置中获得了它。

我正在现有的Spring Boot项目中设置一个Liquibase。该项目还配置了Hibernate,并且使用以下配置:

...
spring.jpa.hibernate.ddl-auto=validate
...

不幸的是,Hibernate验证是在Liquibase迁移之前执行的,这会使应用程序崩溃,因为Hibernate无法检测到将由Liquibase创建的表。另外,我不想关闭此验证。

从多个SO解答和博客文章中,我知道我需要做的就是推迟entityManagerFactory bean的创建,并使其依赖于使用@DependsOn的Liquibase bean的创建。注释,但是问题是,我不想重复Spring Boot自动配置已经在做的工作。

这是建议的方法,但令我不满意:

    @Bean
    public SpringLiquibase liquibase(DataSource dataSource) {
        SpringLiquibase liquibase = new SpringLiquibase();
        liquibase.setChangeLog("classpath:liquibase-changelog.xml");
        liquibase.setDataSource(dataSource);
        return liquibase;
    }

    @Bean
    @DependsOn("liquibase")
    // I get this LocalContainerEntityManagerFactoryBean configured from Spring Boot Autoconfiguration, 
    // so I see no point of configuring it once again
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(Properties hibernateProperties,
                                                                       DataSource dataSource) {
        LocalContainerEntityManagerFactoryBean bean = new LocalContainerEntityManagerFactoryBean();
        bean.setDataSource(dataSource);
        bean.setPersistenceProviderClass(HibernatePersistenceProvider.class);
        bean.setPackagesToScan("com.package");
        bean.setJpaProperties(hibernateProperties);
        return bean;
    }

这是否可以避免覆盖entityManagerFactory bean并使其依赖于Liquibase bean的创建?

0 个答案:

没有答案