组合Hibernate和#x27;s的自动架构创建和数据库版本控制

组合Hibernate和#x27;s的自动架构创建和数据库版本控制,hibernate,database-versioning,Hibernate,Database Versioning,我有一个应用程序,每当应用程序第一次在机器上运行时,Hibernate就会创建我的所有表模式。这很有效 但是现在我想知道Hibernate是否有某种机制来控制数据库的版本,也就是说,当我运行不同版本的应用程序时,Hibernate是否知道如何将一个模式迁移到另一个模式,并且Hibernate发现一个与旧版本不同的数据库模式?考虑到Hibernate可以读取现有的模式,并且可以将模式与映射描述进行比较,我认为这应该是可能的。但是,我不知道如何告诉Hibernate在使用例如Liquibase/Fl

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

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

我可能没有用谷歌搜索到正确的东西,因为Hibernate和版本控制将向您展示许多关于审计和字段版本控制的成功案例,但我更多地考虑了Liquibase/Flyway类型的版本控制。我从未同时考虑过两者,但由于Hibernate不创建更新脚本,而是直接操作数据库,因此我不知道如何使两者一起工作

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


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

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

  • “当前”数据库模式始终由Hibernate生成, 直接针对DEV数据库
  • “上一个”数据库模式是 由一系列LiquiBase更改集生成
  • 每次 如果需要迁移,则在 “先前”和“当前”数据库(两个实际数据库,是, 更可靠的方法),生成新的LiquiBase更改集
  • 这个 更改集需要手动审查。保留所有变更集 在源代码控制中
  • 生产数据库有其模式 通过应用所有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中生成的更改集,但大多数情况下都没有问题,而且肯定比手动编写架构更改操作容易得多。

    Hibernate有一个hbm2ddl.auto值“update”,该值将尝试执行此操作,但不可靠。根据我使用hibernate的经验,这些模式更新应该始终由手动编写的模式更新sql脚本来处理。通常,应用程序使用的db用户也不应该具有创建/删除权限,尽管这可能不适用于您的情况。在我看来,最后编写的模式是某种代码重复,因为它简单地反映了通过实现Java对象已经描述的域模型。通常情况下,这种复制没有那么昂贵,但对于Envers来说,确实如此。因此,我希望我有一个解决办法。在什么情况下,您体验到hbm2dll.auto不足。这可能是实现自定义Flyway migrator的一个很好的切入点。几乎在所有上下文中都是如此。hibernate无法更新现有列的任何重组或除“使用单个默认值添加列”或“删除此列”之外的任何更改。是。液化酶是你想要使用的。Hibernate的自动ddl特性主要是一个开发/测试工具。我很确定大多数优秀的Hibernate书籍都提到过这一点,所以我不确定为什么人们会尝试使用自动ddl进行生产模式迁移。但我认为我需要找到这样的解决办法。你没有碰巧开源你的解决方案?你知道,我其实不介意这么做。只是代码的这一部分嵌入到了我们的项目中。这将需要一点努力来进一步清理它,使它对你和其他人有用。请让我确定您想要通过这条路线,并可能帮助清理代码,使其对其他人有用。