如果我将数据源从 `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` 属性将停止工作的主要内容,如果未能解决你的问题,请参考以下文章

将Sonarqube从嵌入式H2切换到支持的数据库

Jhipster 5.7.2 如何从 H2 迁移到 mysql 保留我的修改

如何从其他(Postgres)数据库加载内存数据库中的数据?

从内存数据库中的 H2 切换到 SQL Server 时出错

如何使用 psql 从 postgres 中的数据库切换?

H2 - Postgres 模式支持网络数据类型