如果我将数据源从 `H2` 切换到 `postgresql`,`hibernate.hbm2ddl.import_files` 属性将停止工作
Posted
技术标签:
【中文标题】如果我将数据源从 `H2` 切换到 `postgresql`,`hibernate.hbm2ddl.import_files` 属性将停止工作【英文标题】:`hibernate.hbm2ddl.import_files` property stops working if I switch the datasource from `H2` to `postgresql` 【发布时间】:2020-08-24 04:25:33 【问题描述】:这是我的 Spring Boot 应用程序的配置:
@Configuration
@EnableJpaAuditing
public class Cfg
@Bean(destroyMethod = "close")
public DataSource myDataSource()
org.apache.tomcat.jdbc.pool.DataSource o = new org.apache.tomcat.jdbc.pool.DataSource();
o.setDriverClassName("org.h2.Driver");
o.setUrl("jdbc:h2:mem:test");
return o;
@Bean("entityManagerFactory")
public LocalSessionFactoryBean sessionFactory(DataSource myDataSource)
LocalSessionFactoryBean o = new LocalSessionFactoryBean();
o.setDataSource(myDataSource);
o.setPackagesToScan("fctorial.crossover.entities");
Properties props = new Properties();
props.setProperty("hibernate.dialect", "org.hibernate.dialect.H2Dialect");
props.setProperty("hibernate.show_sql", "true");
props.setProperty("hibernate.format_sql", "true");
props.setProperty("hibernate.hbm2ddl.auto", "none");
props.setProperty("hibernate.hbm2ddl.import_files", "classpath:/schema.sql,classpath:/data.sql");
o.setHibernateProperties(props);
return o;
它按预期工作,但由于某种原因,如果我将数据库更改为 postgresql(通过以下补丁),import_files
将不再执行。
@@ -17,8 +17,10 @@
@Bean(destroyMethod = "close")
public DataSource myDataSource()
org.apache.tomcat.jdbc.pool.DataSource o = new org.apache.tomcat.jdbc.pool.DataSource();
- o.setDriverClassName("org.h2.Driver");
- o.setUrl("jdbc:h2:mem:test");
+ o.setDriverClassName("org.postgresql.Driver");
+ o.setUsername("saga");
+ o.setPassword("");
+ o.setUrl("jdbc:postgresql://localhost:5432/postgres");
return o;
@@ -28,7 +30,7 @@
o.setDataSource(myDataSource);
o.setPackagesToScan("fctorial.crossover.entities");
Properties props = new Properties();
- props.setProperty("hibernate.dialect", "org.hibernate.dialect.H2Dialect");
+ props.setProperty("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect");
props.setProperty("hibernate.show_sql", "true");
props.setProperty("hibernate.format_sql", "true");
props.setProperty("hibernate.hbm2ddl.auto", "none");
我在schema.sql
的顶部有这个:
NOT A VALID SQL STATEMENT;
h2
版本的应用在启动时抛出错误,但postgresql
版本在启动时没有错误,并且在运行时出现故障,因为数据库未正确初始化。
注意:此代码库是演示此问题的完整示例:https://github.com/fctorial/crud
【问题讨论】:
代码将 Spring Boot 用于内存数据库,Spring Boot (您尝试使用导入数据库)自动创建,而不是真正的数据库。schema.sql
也不适用于 postgresql,因为它没有 AUTO_INCREMENT
你应该使用 SERIAL
列。话虽如此,如果这是 Spring Boot(根据依赖项),您根本不应该使用 DataSource
并让 Spring Boot 来做。在 @Bean
方法中,不需要自动检测到的 close
。
【参考方案1】:
也许这个答案可以帮助你hibernate.hbm2ddl.import_files: Path to the files
这些文件仅在创建架构时使用
【讨论】:
以上是关于如果我将数据源从 `H2` 切换到 `postgresql`,`hibernate.hbm2ddl.import_files` 属性将停止工作的主要内容,如果未能解决你的问题,请参考以下文章
Jhipster 5.7.2 如何从 H2 迁移到 mysql 保留我的修改
如何从其他(Postgres)数据库加载内存数据库中的数据?