首先,有一点背景。我有一套Java应用程序,有些基于JPA,有些则没有。为了创建数据库,我目前正在使用Hibernates模式导出来为使用JPA的用户生成创建脚本。那些不使用JPA的人会手工生成脚本。然后使用ANT在应用程序安装过程中运行它们。对于更新,应用程序安装程序只需将更新脚本应用于数据库。
为了改善数据库更新的管理,我一直在研究Flyway和Liquibase。两者似乎几乎都可以满足我的要求(此外:由于我们拥有的所有预先存在的SQL / DDL脚本,目前我更喜欢Flyway)。我可以看到的问题是它们都直接更新数据库。这对于很多安装都很好,但不是全部。
我想做的是针对数据库运行Flyway / Liquibase,并生成一个更新脚本,其中包含使数据库保持最新状态所需的所有更新-包括Flyway / Liquibase需要对其自己的表进行的任何更改。这将允许我(或更重要的是数据库管理员)在应用程序外部运行更新脚本以更新数据库。然后,我可以在应用程序中纯粹使用Flyway / Liquibase来验证数据库是否最新。
是否可以使用Flyway或Liquibase或任何其他工具来做到这一点?
Liquibase处理得很好。它以当前状态查看数据库,查找未应用的变更集,并update在sql输出模式下使用命令生成SQL脚本。
update
无论如何,使用适当的数据库迁移工具代替Hibernate generator是最好的选择,迟早您会遇到Hibernate不支持的情况。对我们来说,它正在删除一个唯一索引,并用另一个索引代替它。您还可以使hibernate.hbm2ddl.auto=validate自己对数据库结构和实体Bean之间的兼容性感到放心。
hibernate.hbm2ddl.auto=validate