【问题标题】:Combine Hibernate's automatic schema creation and database versioning结合 Hibernate 的自动模式创建和数据库版本控制
【发布时间】:2013-09-03 09:08:33
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • Hibernate 的 hbm2ddl.auto 值为“update”,它会尝试执行此操作,但它不可靠。根据我使用休眠的经验,这些模式更新应始终由手动编写的模式更新 sql 脚本处理。通常,应用程序使用的 db 用户也不应该具有创建/删除权限,尽管这可能不适用于您的情况。
  • 在我看来,最终的模式编写是某种代码重复,因为它只是反映了已经通过实现我的 Java 对象描述的域模型。通常,这种复制并不那么昂贵,但对于 Envers,它就是如此。因此,我希望我有一个解决方案。您在什么情况下遇到了 hbm2dll.auto 不足的情况。这可能是实现自定义 Flyway 迁移器的一个很好的切入点。
  • 几乎所有上下文。除了“添加具有单个默认值的列”或“删除此列”之外的任何现有列的重组或任何更改都超出了休眠更新的能力。

标签: hibernate database-versioning


【解决方案1】:

我们的 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 中有人工审核,但大部分时间没有问题,而且肯定比手动编写 schema 变更操作要容易得多。

【讨论】:

  • 是的。 Liquibase 是您想要使用的。 Hibernate 的 auto-ddl 功能主要是一个开发/测试工具。我很确定大多数优秀的 Hibernate 书籍中都提到了这一点,所以我不确定为什么人们会尝试使用 auto-ddl 进行生产模式迁移。
  • 我猜是因为方便。但我认为我需要采取这样的解决方案。您没有碰巧开源您的解决方案?
  • 你知道,我其实不介意那样做。只是这部分代码有点嵌入到我们的项目中。进一步清理它并使其对您和其他人有用需要一点努力。让我确定你想通过路由,也许可以帮助清理代码以使其对其他人有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-30
  • 1970-01-01
  • 2020-04-03
  • 2016-11-12
  • 2014-01-25
  • 2011-09-25
  • 1970-01-01
相关资源
最近更新 更多