Spring Boot 中的多个 SQL 导入文件

Posted

技术标签:

【中文标题】Spring Boot 中的多个 SQL 导入文件【英文标题】:Multiple SQL import files in Spring Boot 【发布时间】:2014-08-21 21:25:45 【问题描述】:

通过Spring Boot reference manual,我们可以通过多种方式在应用程序启动时导入数据。结合内存数据库,这对于测试来说相当方便。

选项是创建一个名为 import.sql 的文件,它将被 Hibernate 拾取,或者创建一个名为 data.sql 的文件,它将被 Spring JDBC 拾取。这两个对我来说都很好。

但是,我喜欢将我的项目分解一下,所以我目前有一个核心域模型,其中有一些方便的导入来配置一些用户等核心数据,这些数据在任何地方都可以使用。我也有特定于函数的项目,在这些项目中重复使用相同的基础数据导入很有用,但也导入了一些特定于该函数的附加数据。

这就是事情不太顺利的地方。

我找到了an answer to a previous question,其中 Pascal Thivent 提到 hibernate.hbm2ddl.import_files 属性可用于定义文件列表,从 Hibernate 3.6.0.Beta1 开始。鉴于我的项目正在导入 4.3.1.Final,我认为这可能会可用。

所以我尝试将以下内容添加到我的 Spring Boot application.properties:

spring.jpa.hibernate.hbm2ddl.import_files=/another-import.sql

和:

hibernate.hbm2ddl.import_files=/another-import.sql

很遗憾,这些都不会导致导入运行。

所以我想知道我是不是把上面的属性弄得一团糟(很可能)。或者我还有什么需要做的吗?

请注意,作为一种解决方法,我发现 Spring JDBC 似乎在 Hibernate 运行 import.sql 之后运行 data.sql。因此,只要我不需要两个以上的导入,我就可以将import.sql 用于基础数据,然后将特定于项目的导入放入data.sql。我可以解决这个问题,但这并不是真正的解决方案。

【问题讨论】:

您是在定义自己的 jpaProperties 和 entityManagerFactory bean,还是使用默认的魔法? 这只是默认魔法。 :) 使用spring.jpa.properties.hibernate.hbm2ddl.import_files。有关属性列表,请参阅reference guide。如果您想要多个资源,只需为spring.datasource.data 和/或spring.datasource.schema 使用一个通用的分隔列表(默认分别为dataschema。或者您可以提出一个命名约定并将表达式放在那里@例如 987654339@。 【参考方案1】:

如果你真的想使用 hibernate 属性前缀 spring.jpa.properties.,因为它们是作为属性添加到 EntityManagerFactory 的。请参阅 Spring Boot 参考指南中的 here。

spring.jpa.properties.hibernate.hbm2ddl.import_files=file1.sql,file2.sql

但是,您也可以使用 spring.datasource.dataspring.datasource.schema 属性来发挥自己的优势。它们分别默认为dataschema。正如您在 DataSourceInitializer 类中看到的那样。您还可以设置它们,它们采用逗号分隔的资源列表。

spring.datasource.data=classpath:/data-domain.sql,file:/c:/sql/data-reference.sql,data-complex.sql

它变得更好,因为资源加载还允许使用 ant-style patterns 加载资源。

spring.datasource.data=/META-INF/sql/init-*.sql
spring.datasource.schema=/META-INF/sql/schema-*.sql 

【讨论】:

这是我的属性文件中的一个错字。我想我之前犯过同样的错误,因为我的配置中有一些spring.jpa.hibernate 属性,所以我只是遵循相同的模式。 我必须在行前加上“classpath*:/META-INF/...”(带星号的类路径),才能从其他 Maven 模块读取文件。很好的答案,谢谢! 同上 w/classpath*: 即使只是本地打包文件也需要。我想把我的东西更多地分开,并像约定一样使用 Flyways,所以我有 spring.datasource.data=classpath*:db/data/V*.sql

以上是关于Spring Boot 中的多个 SQL 导入文件的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 使用 spring.datasource.data 的时候找不到数据文件

Spring Boot JPA:为同一参数传递多个值 (JPQL)

从 AWS Secrets Manager 导入 Spring Boot 应用程序中的密钥

Spring Boot - 如何为指定根目录中的多个路由提供一个静态 html 文件

Spring BootSpring Boot项目设置多个配置文件,并在生产环境中的Tomcat设置对应的配置文件

spring boot 项目在启动时执行指定sql文件