我之前没有像Liquibase等类似工具的经验。到目前为止,我通常使用Hibernate在应用程序上部署生产的方式是使用手动SQL来修改表,因为它们是非常简单的应用程序(复杂的应用程序没有使用它...请不要问: p)。
我想在Play中使用Evolutions,但我发现它在开发过程中与Hibernate发生了很大的冲突,使其成为一种痛苦而不是现实的选择。在开发过程中,Hibernate很容易管理所有内容,因此没有必要使用Evolutions,但我们希望保留结构(文件),以便在生产模式下更轻松地迁移应用程序。但由于冲突似乎并不值得。
Liquibase有一个Play模块,但是自从Evolutions发布以来它似乎已经停止了(我想知道为什么,因为我相信它会对Hibernate产生误解)。
问题是:
答案 0 :(得分:8)
通常的情况是,应用程序在其生命周期中有两个阶段 - 初始开发和后期制作“维护”。我的经验是,所有大型数据库更改通常都会在第一阶段发生。通过依赖Hibernate让自己变得灵活,然后当你去制作时,你会采用模式转储,使用Evolutions在生产中滚动它,并从那里手动管理你的DDL。
在第二个“阶段”(我是一个敏捷人,我讨厌这个词;-)),模式更改通常也包括DML,因为你必须计算新列的初始值,等等。此外,您通常会花费更多时间在编码上而不是模式更改上,因此整个手动体验变得不那么痛苦了:)。
(话虽如此 - 我喜欢Evolutions和Play / Hibernate之间更好的集成,比如可以选择记录Hibernate向evolutions目录发出的DDL)
答案 1 :(得分:4)
嗯,你问一个非常好的问题。我在grails上遇到了这个问题,所以我没有真正的解决方案,而是一些想法。我将首先将Evolutions与Liquibase进行比较:
现在来一般的问题。我认为你必须选择:
那么我的建议是什么?我会尝试以下方法:使用分布式版本控制系统进行开发,如bzr或git。然后使用功能分支。用于功能分支始终是休眠功能。在将内容合并到主干之前,请创建liquibase-script。这些脚本可以通过liquibase生成并进行一些手动定制)。因此,您可以非常快速地开发功能,并且在主干中始终具有强大的解决方案2。 多么有意识到这不是一个伟大的项目中的证明方法。我只在一个小项目上用Hibernate和Liquibase测试了这个策略 - 它运行正常。
获得反馈意见非常好。
答案 2 :(得分:0)
关于让hibernate吐出SQL以让你开始使用Evolutions或Flyway,请看一下:http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/toolsetguide.html#toolsetguide-s1-6
编辑:我实际上制作了一个插件来引导您的迁移脚本。我认为这可能对遇到这个帖子的大多数人有用: http://web.ist.utl.pt/~joao.a.p.antunes/2014/08/09/play-2-2-x-jpa-hibernate-database-migration干杯!