【问题标题】:Run SpringLiquibase BEFORE Hibernate在休眠之前运行 SpringLiquibase
【发布时间】:2016-07-24 03:36:31
【问题描述】:

我正在使用 SpringLiquibase 在应用程序启动期间自动应用我的 liquibase 更新。一般来说,这很好用,但是当我将 hibernate.hbm2ddl.auto 设置为“验证”时,在 liquibase 似乎有机会应用更新之前,hibernate 开始抱怨数据库方案。 我的配置如下:

@Configuration
@EnableTransactionManagement
@ComponentScan(basePackages = "com.myapp")
@PropertySource(value = {"classpath:myapp.properties"})
@EnableJpaRepositories("com.myapp")
public class MyappConfig {

    @Resource
    private Environment env;

    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();

        dataSource.setDriverClassName(env.getRequiredProperty("jdbc.driver"));
        dataSource.setUrl(env.getRequiredProperty("jdbc.url"));
        dataSource.setUsername(env.getRequiredProperty("jdbc.username"));
        dataSource.setPassword(env.getRequiredProperty("jdbc.password"));

        return dataSource;
    }

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

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
        LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
        entityManagerFactoryBean.setDataSource(dataSource());
        entityManagerFactoryBean.setPersistenceProviderClass(HibernatePersistenceProvider.class);
        entityManagerFactoryBean.setPackagesToScan("com.myapp");

        entityManagerFactoryBean.setJpaProperties(hibernateProperties());

        return entityManagerFactoryBean;
    }

    private Properties hibernateProperties() {
        Properties properties = new Properties();

        String[] propertyNames = new String[]{"hibernate.dialect", "hibernate.show_sql", "hibernate.hbm2ddl.auto"};

        for (String propertyName : propertyNames) {
            properties.put(propertyName, env.getRequiredProperty(propertyName));
        }
        return properties;
    }

    @Bean
    public JpaTransactionManager transactionManager() {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(entityManagerFactory().getObject());
        return transactionManager;
    }

}

在 hibernate 尝试验证架构之前,有什么方法可以让 liquibase 应用其更新?

【问题讨论】:

  • 您可以尝试将@DependsOn("liquibase") 添加到您的entityManagerFactory bean 定义中。
  • 谢谢,这对我有用!
  • 如果我在 applicationContext.xml 中声明了 bean,我该如何处理 @DependsOn("liquibase")
  • @MoroianuAlexandru 你也可以将 liquibase 的配置移动到 applicationContext.xml 中
  • 谢谢@M。 Deinum & VinhNT 我通过在 applicationContext.xml 中应用依赖来解决它...在 xml 中定义以下代码:<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" depends-on="liquibase"> [...]

标签: java spring hibernate liquibase


【解决方案1】:

感谢M. Deinum 我能够通过使用解决这个问题

@Bean
@DependsOn("liquibase")
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
   [...]
}

@DependsOn 确保 liquibase 在 Hibernates 架构验证之前运行。

【讨论】:

  • 如何使用 Spring-JPA 在 Spring-Boot 中执行此操作?当我执行 mvn install 时,首先执行 liquibase。但是当我启动应用程序时,首先运行的是hibernate ddl。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-11
  • 1970-01-01
  • 2023-03-30
  • 2018-12-05
  • 2021-05-29
  • 2015-07-19
相关资源
最近更新 更多