在不使用 hibernate.hbm2ddl.auto 的情况下,如何将所有初始模式导出到 Flyway?

Without using hibernate.hbm2ddl.auto, how do I export all the initial schema into Flyway?

我的 JEE 开发已接近准备就绪阶段。由于很多建议不要在生产中使用 Hibernate hbm2ddl.auto,我决定将其删除。

所以现在,我发现了 Flyway,这对未来的数据库更改和迁移来说似乎很棒,但我在第一步就卡住了:我有很多实体,一些实体继承自基础实体。这使得 CREATE 语句非常复杂。

创建第一个迁移文件的最佳做法是什么?

谢谢!

如果您在开发过程中采用了 "entities first" 方法,您将需要以相同的方式为第一次实时部署生成初始模式:这将生成 Flyway 使用的第一个创建脚本,然后可能还需要第二个关联脚本来填充参考数据。

简而言之,第一次部署后无法再使用hbm2ddl.auto的原因是create会破坏现有数据,update不够可靠涵盖所有类型的架构更改(听起来您可能已经从 this SO question 中了解到)。

Flyway 是一个非常有用的工具,但它确实需要一定程度的纪律,这在开发过程中可能不存在。从初始版本向前推进时,需要为 Flyway 生成数据库更新脚本,这些脚本等同于自上次发布以来对实体所做的更改。有一些工具(例如来自 Redgate 的各种商业产品)可能对这里有所帮助:这些工具尝试 "diff" 两个模式并生成模式 and/or 数据更新脚本,用于从数据库 A 到数据库 B。但根据我的经验,none 他们是完美的,他们并没有完全达到实现完全自动化方法的圣杯。

可以说,最好的方法是 "as you go" 手动方法,以确保每当进行影响架构或引用数据的实体更改时,都将非破坏性更新脚本提交给源代码管理 - 但如前所述, 这将需要一些纪律 and/or 记录在案的流程供所有团队成员遵循。

我不确定 Flyway,但还有另一种方法,您可以使用 ant tasks for hibernate 来生成或更新模式。

希望对您有所帮助。

对于第一个迁移文件,您只需要数据库的当前ddl。有许多工具可以为您提供此功能(例如 IntelliJ IDEA 数据库工具中的 "copy ddl" 选项或您的数据库供应商提供的 GUI 客户端)。

如果您使用 Maven 构建项目,则可以使用 Hibernate maven plugin