【问题标题】:load schema from .sql to create orm mapping in springboot从 .sql 加载模式以在 Spring Boot 中创建 orm 映射
【发布时间】:2019-10-13 08:42:32
【问题描述】:

有什么方法可以在启动服务器时从 .sql 或 json 或文本文件中加载数据库架构,以便在 spring-boot 中创建使用 JPA/Hibernate 到数据库的 ORM 映射。

【问题讨论】:

标签: java spring hibernate spring-boot spring-data-jpa


【解决方案1】:

Spring Boot 允许您使用数据库迁移工具,例如 LiquibaseFlyway,您可以在 Spring's official documentation 上阅读更多相关信息。

编辑:来自文档

85.5 使用更高级别的数据库迁移工具

Spring Boot 支持两种更高级别的迁移工具:Flyway 和 Liquibase。

85.5.1 在启动时执行 Flyway 数据库迁移

要在启动时自动运行 Flyway 数据库迁移,请将 org.flywaydb:flyway-core 添加到您的类路径中。

迁移是 V__.sql 形式的脚本(带有下划线分隔的版本,例如“1”或“2_1”)。默认情况下,它们位于名为 classpath:db/migration 的文件夹中,但您可以通过设置 spring.flyway.locations 来修改该位置。这是一个或多个 classpath: 或 filesystem: 位置的逗号分隔列表。例如,以下配置将在默认类路径位置和 /opt/migration 目录中搜索脚本:

spring.flyway.locations=classpath:db/migration,filesystem:/opt/migration 您还可以添加一个特殊的 {vendor} 占位符来使用特定于供应商的脚本。假设如下:

spring.flyway.locations=classpath:db/migration/{vendor} 前面的配置没有使用 db/migration,而是根据数据库的类型(例如 MySQL 的 db/migration/mysql)设置要使用的文件夹。 DatabaseDriver 中提供了支持的数据库列表。

FlywayProperties 提供 Flyway 的大部分设置和一小组附加属性,可用于禁用迁移或关闭位置检查。如果您需要对配置进行更多控制,请考虑注册 FlywayConfigurationCustomizer bean。

Spring Boot 调用 Flyway.migrate() 来执行数据库迁移。如果您想要更多控制权,请提供一个实现 FlywayMigrationStrategy 的 @Bean。

Flyway 支持 SQL 和 Java 回调。要使用基于 SQL 的回调,请将回调脚本放在 classpath:db/migration 文件夹中。要使用基于 Java 的回调,请创建一个或多个实现 Callback 的 bean。任何此类 bean 都会自动向 Flyway 注册。它们可以通过使用@Order 或通过实现Ordered 来订购。也可以检测到实现了已弃用的 FlywayCallback 接口的 Bean,但它们不能与 Callback bean 一起使用。

默认情况下,Flyway 在您的上下文中自动装配 (@Primary) 数据源并将其用于迁移。如果您想使用不同的 DataSource,您可以创建一个并将其 @Bean 标记为 @FlywayDataSource。如果您这样做并且想要两个数据源,请记住创建另一个并将其标记为@Primary。或者,您可以通过在外部属性中设置 spring.flyway.[url,user,password] 来使用 Flyway 的原生数据源。设置 spring.flyway.url 或 spring.flyway.user 足以使 Flyway 使用自己的 DataSource。如果三个属性中的任何一个都没有设置,将使用其等效 spring.datasource 属性的值。

有一个 Flyway 示例,您可以了解如何设置。

您还可以使用 Flyway 为特定场景提供数据。例如,您可以将特定于测试的迁移放在 src/test/resources 中,并且它们仅在您的应用程序启动测试时运行。此外,您可以使用特定于配置文件的配置来自定义 spring.flyway.locations 以便某些迁移仅在特定配置文件处于活动状态时运行。例如,在 application-dev.properties 中,您可以指定以下设置:

spring.flyway.locations=classpath:/db/migration,classpath:/dev/db/migration 通过该设置,dev/db/migration 中的迁移仅在 dev 配置文件处于活动状态时运行。

85.5.2 在启动时执行 Liquibase 数据库迁移

要在启动时自动运行 Liquibase 数据库迁移,请将 org.liquibase:liquibase-core 添加到您的类路径中。

默认情况下,从 db/changelog/db.changelog-master.yaml 读取 master 更改日志,但您可以通过设置 spring.liquibase.change-log 来更改位置。除了 YAML,Liquibase 还支持 JSON、XML 和 SQL 更改日志格式。

默认情况下,Liquibase 在您的上下文中自动连接 (@Primary) 数据源并将其用于迁移。如果您需要使用不同的 DataSource,您可以创建一个并将其 @Bean 标记为 @LiquibaseDataSource。如果您这样做并且想要两个数据源,请记住创建另一个数据源并将其标记为@Primary。或者,您可以通过在外部属性中设置 spring.liquibase.[url,user,password] 来使用 Liquibase 的本机数据源。设置 spring.liquibase.url 或 spring.liquibase.user 足以使 Liquibase 使用它自己的 DataSource。如果三个属性中的任何一个都没有设置,将使用其等效 spring.datasource 属性的值。

有关可用设置(例如上下文、默认架构等)的详细信息,请参阅 LiquibaseProperties。

有一个 Liquibase 示例,您可以了解如何进行设置。

Spring 还支持自己的数据库初始化,official docs are here

Spring Boot 可以自动创建 DataSource 的模式(DDL 脚本)并初始化它(DML 脚本)。它分别从标准根类路径位置加载 SQL:schema.sql 和 data.sql。

【讨论】:

  • 您能在此处添加文档的相关部分吗?正如 Stackoverflow 的指南 (stackoverflow.com/help/how-to-answer) 中所述:“鼓励链接到外部资源,但请在链接周围添加上下文,以便您的其他用户了解它是什么以及为什么存在。始终引用最相关的部分重要链接,以防目标站点无法访问或永久离线。”
猜你喜欢
  • 1970-01-01
  • 2011-10-19
  • 2016-01-30
  • 1970-01-01
  • 2017-10-12
  • 2021-09-23
  • 2018-11-22
  • 2017-02-21
  • 2021-03-03
相关资源
最近更新 更多