【问题标题】:Spring Boot Profiles - have an sql-script run instead of ddl-autoSpring Boot Profiles - 运行 sql-script 而不是 ddl-auto
【发布时间】:2024-05-28 21:10:02
【问题描述】:

我设置了 3 个配置文件(dev/test/prod)像魔术一样工作(java 和 spring boot 的新手)

在我的开发配置文件中,数据库是使用

生成的
hibernate.ddl-auto

工作得很好......也与

.hibernate.hbm2ddl.import_files

我用测试数据填充数据库的女巫

在测试环境中,我想运行一个脚本,它从转储中设置数据库.. 更像是生产环境(实体由于某种原因与数据库不匹配)

所以我尝试使用:

datasource.data 

&& ||

datasource.schema

在不同的组合中,与 文件:,类路径前缀.....

当我这样做时:

datasource.data=data.sql

它在说:

'ServletContext resource [/data.sql]' is invalid: The specified resource does not exist

... 移动文件 .... /src/main /src/main/resources /src/main/resources/META-INF .. 所有这些东西

我不明白“ServletContext”是什么意思…………

我确实禁用了

hibernate.ddl-auto

通过在该配置文件中将其设置为无

还有

hibernate.jpa.generate-ddl

设置为false,即使在设置ddl-auto时不需要/使用

...在我的“google-searching”这个任务中,我遇到了 2014 年的帖子并完全困惑,因为从那时起就出现了......

有,我指望它;),一些必须设置为“runThisScript”的属性,但我通过了文档......可能我错过了一些东西

有人能指出我正确的方向吗?
谢谢!

感谢@Blagoj 的快速响应,该链接帮助了我.. 脚本通过设置 ddl-auto 创建来执行.. 但它也从实体生成...如何阻止它这样做 && 有脚本执行了吗?

谢谢@luboskrnac 你的建议!会看看/使用它! ..困扰我的是,我必须做错/从我的观点来看不太好......在开发中匹配产品.....曾希望在开发中做对并且一旦我在那个状态下得到刺激可以证明它是正确的;)

...好吧,现在我最终手动设置了测试环境..但是一旦我知道更多,我会尝试自动化它...我看到总是有一个工具可以解决注入问题;)

【问题讨论】:

  • 感谢您的快速响应...我将 generate-ddl 设置为 "create" ,据我了解,这会从实体 && 执行脚本生成数据库,但似乎工作...必须仔细看看它做了什么....现在在 sql-script 中出现错误;)

标签: java hibernate spring-boot


【解决方案1】:

使用 Flyway 或 Liquibase 等数据库迁移工具创建初始架构并进行数据库架构的增量迁移。现在重要的一点:在 DEV 和 PROD 环境中做同样的事情!否则就是自找麻烦。

初始模式可以在 Hibernate 的帮助下生成。 spring.jpa.hibernate.ddl-auto=create 将从您的 JPA 模型创建架构 + logging.level.org.hibernate.SQL=DEBUG 将碰撞 SQL 命令来创建此架构。此 SQL 转储可用作 Flyway 或 Liquibase 的初始迁移脚本。

您甚至可以将示例数据插入 PROD(如果您可以将它们隐藏在测试帐户后面)。您可以对 PROD 实例运行自动化测试,这可以方便地验证重要功能在 PROD 中是否正常工作。

【讨论】:

  • 我的建议是“如果你只绑定一个 dbms,那么只依赖 liquibase 的脚本,不要依赖 hbm2ddl”,因为它允许非常细粒度的 sql 类型和约束。当从一个 dbms 切换到另一个时,混合使用 hbm2ddl 和 liquibase 可能会导致意外结果。
  • 我提到要专门使用数据库迁移工具 + 使用ddl-auto 生成 initial 架构。我的方法不是混合它们。
最近更新 更多