玩,休眠和进化

时间:2011-07-13 15:30:59

标签: database hibernate jpa playframework

我之前没有像Liquibase等类似工具的经验。到目前为止,我通常使用Hibernate在应用程序上部署生产的方式是使用手动SQL来修改表,因为它们是非常简单的应用程序(复杂的应用程序没有使用它...请不要问: p)。

我想在Play中使用Evolutions,但我发现它在开发过程中与Hibernate发生了很大的冲突,使其成为一种痛苦而不是现实的选择。在开发过程中,Hibernate很容易管理所有内容,因此没有必要使用Evolutions,但我们希望保留结构(文件),以便在生产模式下更轻松地迁移应用程序。但由于冲突似乎并不值得。

Liquibase有一个Play模块,但是自从Evolutions发布以来它似乎已经停止了(我想知道为什么,因为我相信它会对Hibernate产生误解)。

问题是:

  • 如何管理生产中应用的数据库迁移?
  • 当您的模型在发行版之间更改并且必须部署到生产环境时,您使用的常用过程/步骤是什么?
  • 我们忽略了Hibernate的任何特定工具或功能,或只是旧忠实的SQL Alter表和类似的?
  • 专注于Play Framework,您如何管理?

3 个答案:

答案 0 :(得分:8)

通常的情况是,应用程序在其生命周期中有两个阶段 - 初始开发和后期制作“维护”。我的经验是,所有大型数据库更改通常都会在第一阶段发生。通过依赖Hibernate让自己变得灵活,然后当你去制作时,你会采用模式转储,使用Evolutions在生产中滚动它,并从那里手动管理你的DDL。

在第二个“阶段”(我是一个敏捷人,我讨厌这个词;-)),模式更改通常也包括DML,因为你必须计算新列的初始值,等等。此外,您通常会花费更多时间在编码上而不是模式更改上,因此整个手动体验变得不那么痛苦了:)。

(话虽如此 - 我喜欢Evolutions和Play / Hibernate之间更好的集成,比如可以选择记录Hibernate向evolutions目录发出的DDL)

答案 1 :(得分:4)

嗯,你问一个非常好的问题。我在grails上遇到了这个问题,所以我没有真正的解决方案,而是一些想法。我将首先将Evolutions与Liquibase进行比较:

  1. Liquibase是一个成熟的解决方案,即使插件不再开发,底层库也是如此。所以我认为这是一个可以接受的解决方案。
  2. 如果您使用Evolution,那么与liquibase相比,您有一个很大的劣势:您必须直接编写SQL,因此脚本取决于您的数据库系统。想想布尔值和不同数据库中的表示。所以你失去了Hibernate给你的好处。
  3. 现在来一般的问题。我认为你必须选择:

    1. 让Hibernate为您处理数据库结构。只有在Hibernate无法完成工作的情况下,才能使用liquibase或evolutions。不幸的是,如果您有复杂的更新方案,您可能会遇到一些麻烦。你怎么能赢得你的发展更快。
    2. 您忽略了Hibernate中的所有DDL功能,并使用liquibase或evolutions执行所有操作。这是最可靠和最强大的解决方案,但显然您在开发方面有更多工作要做。
    3. 那么我的建议是什么?我会尝试以下方法:使用分布式版本控制系统进行开发,如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

干杯!