【发布时间】: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