如果我将数据源从H2切换到postgresql,则hibernate.hbm2ddl.import_files属性将停止工作

问题描述

这是我的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

解决方法

也许这个答案可以帮助您hibernate.hbm2ddl.import_files: Path to the files

仅在创建架构时使用文件