【发布时间】: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")添加到您的entityManagerFactorybean 定义中。 -
谢谢,这对我有用!
-
如果我在
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