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
使用一个通用的分隔列表(默认分别为data
和schema
。或者您可以提出一个命名约定并将表达式放在那里@例如 987654339@。
【参考方案1】:
如果你真的想使用 hibernate 属性前缀 spring.jpa.properties.
,因为它们是作为属性添加到 EntityManagerFactory
的。请参阅 Spring Boot 参考指南中的 here。
spring.jpa.properties.hibernate.hbm2ddl.import_files=file1.sql,file2.sql
但是,您也可以使用 spring.datasource.data
和 spring.datasource.schema
属性来发挥自己的优势。它们分别默认为data
和schema
。正如您在 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 文件