【发布时间】:2020-02-19 08:28:07
【问题描述】:
是否可以选择性地选择 Hibernate 的架构生成设置适用于哪些实体或数据源?
hibernate.hbm2ddl.auto=none
我想使用我不想修改的数据库的现有表,但也会自动创建一些新表。
【问题讨论】:
标签: hibernate properties entity database-schema
是否可以选择性地选择 Hibernate 的架构生成设置适用于哪些实体或数据源?
hibernate.hbm2ddl.auto=none
我想使用我不想修改的数据库的现有表,但也会自动创建一些新表。
【问题讨论】:
标签: hibernate properties entity database-schema
您必须使用 ->hibernate.hbm2ddl.auto=update 而不是 none。
【讨论】:
我找到了一篇很好的文章,它描述了如何通过定义多个指向不同实体包的配置类来做到这一点。似乎唯一的方法就是以编程方式进行。
对于我不想创建或更新任何表的现有数据库表,我将以下配置设置为 hibernate.hbm2ddl.auto 设置为 none
@PropertySource({"classpath:existing-database.properties"})
@EnableJpaRepositories(basePackages = "com.project.model.existing")
@Configuration
public class ExistingDatabaseConfig {
@Autowired
private Environment env;
@Bean
@Primary
public LocalContainerEntityManagerFactoryBean userEntityManager() {
LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(userDataSource());
em.setPackagesToScan("com.project.model.existing");
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
em.setJpaVendorAdapter(vendorAdapter);
HashMap<String, Object> properties = new HashMap<>();
properties.put("hibernate.hbm2ddl.auto", "none");
properties.put("hibernate.dialect", env.getProperty("hibernate.dialect"));
em.setJpaPropertyMap(properties);
return em;
}
@Primary
@Bean
public DataSource userDataSource() {
DriverManagerDataSource dataSource
= new DriverManagerDataSource();
dataSource.setDriverClassName(env.getProperty("jdbc.driverClassName"));
dataSource.setUrl(env.getProperty("user.jdbc.url"));
dataSource.setUsername(env.getProperty("jdbc.user"));
dataSource.setPassword(env.getProperty("jdbc.pass"));
return dataSource;
}
}
对于那些应该创建表的实体,我将有一个单独的配置,将 hibernate.hbm2ddl.auto 设置为 create-or-update: p>
@PropertySource({"classpath:not-existing-database.properties"})
@EnableJpaRepositories(basePackages = "com.project.model.notexisting")
@Configuration
public class NotExistingDatabaseConfig {
@Autowired
private Environment env;
@Bean
@Primary
public LocalContainerEntityManagerFactoryBean userEntityManager() {
LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(userDataSource());
em.setPackagesToScan("com.project.model.notexisting");
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
em.setJpaVendorAdapter(vendorAdapter);
HashMap<String, Object> properties = new HashMap<>();
properties.put("hibernate.hbm2ddl.auto", "create-or-update");
properties.put("hibernate.dialect", env.getProperty("hibernate.dialect"));
em.setJpaPropertyMap(properties);
return em;
}
@Primary
@Bean
public DataSource userDataSource() {
DriverManagerDataSource dataSource
= new DriverManagerDataSource();
dataSource.setDriverClassName(env.getProperty("jdbc.driverClassName"));
dataSource.setUrl(env.getProperty("user.jdbc.url"));
dataSource.setUsername(env.getProperty("jdbc.user"));
dataSource.setPassword(env.getProperty("jdbc.pass"));
return dataSource;
}
}
【讨论】: