9

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

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

自从 Hibernate 和版本控制将向您展示很多关于审计和现场版本控制的命中时,我可能没有在谷歌上搜索到正确的东西,但我更多地考虑 Liquibase / Flyway 类型的版本控制。我从来没有考虑过两者,但由于 Hibernate 不创建更新脚本而是直接操作数据库,我不知道如何使两者一起工作。

这是我第一次让 Hibernate 创建我的模式,而不是编写我自己的脚本。我这样做是为了利用Hibernate Envers,这使得手动创建脚本变得更加乏味。也许我错过了一些明显的东西。感谢您对此事的任何意见!

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

4

1 回答 1

11

我们的 Java/Hibernate 项目也有同样的问题,并且不希望任何代码重复工作。Hibernate“更新”功能根本不可靠,LiquidBase 更好,但也不是 100% 万无一失。最后我们开发了一个简单的脚本来管理以下过程:

  1. “当前”数据库模式始终由 Hibernate 直接针对 DEV 数据库生成。
  2. “以前的”数据库模式由一系列 LiquiBase 更改集生成。
  3. 每次需要迁移时,都会在“先前”和“当前”数据库(两个实际数据库,是的,这样更可靠)之间调用 LiquiBase“差异”函数,生成新的 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 中对生成的更改集进行了手动审核,但大多数时候没有问题,而且肯定比手动编写模式更改操作要容易得多。

于 2013-09-15T06:19:08.530 回答