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

时间:2013-08-30 15:12:30

标签: hibernate database-versioning

我有一个应用程序,只要应用程序第一次在计算机上运行,​​Hibernate就会创建我的所有表模式。这很好用。

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

我可能没有用Google搜索正确的东西,因为Hibernate和版本控制会在审核和字段版本控制方面给你很多点击,但我更多地考虑了Liquibase / Flyway的版本控制。我从来没有考虑过这两者,但由于Hibernate不创建更新脚本而是直接操作数据库,我不知道如何使两者一起工作。

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

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

1 个答案:

答案 0 :(得分:10)

我们的Java / Hibernate项目遇到了同样的问题,并且不希望任何代码重复工作。 Hibernate“更新”功能根本不可靠,LiquidBase更好但不是百分之百的傻瓜证明。最后,我们开发了一个简单的脚本来管理以下过程:

  1. “当前”数据库架构总是由Hibernate生成, 直接针对DEV数据库。
  2. “以前的”数据库架构是 由一系列LiquiBase变更集生成。
  3. 每次都是 需要迁移,在之间调用LiquiBase“diff”函数 “先前”和“当前”数据库(两个实际数据库,是的, 更可靠的方式),生成一个新的LiquiBase变更集。
  4. 这 需要手动审查更改集。保留所有变更集 在源代码控制中。
  5. PRODUCTION数据库有其架构 通过应用所有LiquiBase更改集生成。
  6. 我们脚​​本中的一个键命令如下所示:

    ${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中手动审查生成的更改集,但大多数时候没有问题,而且确实比手动编写架构更改操作容易得多。