一尘不染

结合使用Hibernate的自动模式创建和数据库版本控制

hibernate

我有一个应用程序,每当该应用程序第一次在计算机上运行时,Hibernate都会创建我的所有表模式。这很好。

但是现在我想知道Hibernate是否具有某种机制来使数据库保持版本控制,即当我运行不同版本的应用程序时,Hibernate是否会知道如何将一个架构迁移到另一个架构,并且Hibernate找到与旧版本不同的数据库架构。版本存在吗?考虑到Hibernate可以读取现有的架构并将架构与映射描述进行比较,我以某种方式认为这应该可行。但是我不知道如何像使用Liquibase
/ Flyway创建更改脚本时那样告诉Hibernate迁移旧数据。

由于Hibernate和版本控制将向您展示很多有关审核和现场版本控制的信息,因此我可能没有在Google上搜索正确的内容,但是我在Liquibase /
Flyway类型的版本管理方面考虑更多。我从未考虑过两者,但是由于Hibernate不会创建更新脚本而是直接操作数据库,因此我不知道如何使两者一起工作。

这是我第一次让Hibernate创建架构而不是编写自己的脚本。我这样做是为了利用Hibernate
Envers
使手动脚本创建变得更加乏味。也许我缺少明显的东西。感谢您对此事的任何投入!

更新:今天我必须与Flyway的开发人员交谈,他告诉我他不知道一个好的解决方案。也许什么都没有?


阅读 237

收藏
2020-06-20

共1个答案

一尘不染

我们在Java /
Hibernate项目中遇到了同样的问题,并且不需要任何代码复制工作。hibernate的“更新”功能根本不可靠,LiquidBase更好,但也不是100%可靠的。最后,我们开发了一个简单的脚本来管理以下过程:

  1. Hibernate总是直接针对DEV数据库由“当前”数据库模式生成。
  2. 一系列LiquiBase变更集生成“先前”数据库架构。
  3. 每次需要迁移时,都会在“先前”数据库和“当前”数据库(两个实际的数据库,是的,这样更可靠)之间调用LiquiBase的“ diff”函数,从而生成新的LiquiBase变更集。
  4. 此更改集需要手动检查。所有更改集都保留在源代码控制中。
  5. PRODUCTION数据库具有通过应用所有LiquiBase变更集生成的架构。

我们脚本中的键盘命令如下所示:

${LIQB_COMMAND} ${PREV_DB_OPTIONS} --changeLogFile=${LIQB_CHGLOG_FILE_NEW}  \
    diffChangeLog \
                --referenceUsername=${DEV_DB_USER} \
                --referencePassword=${DEV_DB_PWD} \
                --referenceDriver=com.mysql.jdbc.Driver \
                --referenceUrl=${DEV_DB_URL}

这样,我们的迁移过程非常可靠,您无需编写模式代码两次。可以手动检查XML中生成的更改集,但是大多数时候都没有问题,而且与手动编写模式更改操作相比,它肯定容易得多。

2020-06-20