当我使用JPA时,如何管理数据库演变?

时间:2012-02-28 18:18:50

标签: mysql jpa playframework

我通过在他们的网站上按照教程构建一个小博客引擎来学习游戏。

它使用JPA并在其引导程序中调用Fixtures.Deletemodels(),(或类似的东西)。

它每次运行时基本上都会核对所有表格,我会丢失所有数据。

我已经部署了一个生产系统(没有nuke声明)。

现在我需要将大量更新部署到生产系统。许多类已更改,已添加并已删除。在我的本地测试中,没有在每次运行时查看表,我遇到了同步问题。当我尝试写或从表中读取时,播放会抛出错误。我打开了mysql,确定表格在某些情况下只是部分修改和修改不正确。即使我在我的配置中将DDL模式设置为“create”,JPA也似乎无法“弄清楚”如何协调更改并相应地修改我的架构。

所以我必须回到我所有表格中的引导语句中。

所以我开始研究Play中的数据库演变,并在play框架网站上阅读有关数据库演变的文章。文章讨论了版本脚本,但它说,“如果您使用JPA,Hibernate可以自动处理数据库演变。如果您不使用JPA,演变很有用。”

因此,如果JPA应该为我处理这个问题,我该如何为大型Play应用程序部署大型更新?到目前为止,JPA无法正确更改架构,应用程序将抛出错误。我对丢失我的所有数据都不感兴趣,所以对dev“Fixtures.deleteModels()”的修复无法真正用于prod。

提前致谢, 约什

4 个答案:

答案 0 :(得分:7)

不,JPA不应该为你照顾它。这不是一个神奇的工具。如果您决定将表“client”重命名为“customer”,将“street”列重命名为“line1”,并将客户类型列的值从1,2,3切换为“bronze”,“silver”,“黄金“,JPA没有办法在你的脑海中读到并自动完成所有变化。

要从一个模式迁移到另一个模式,您可以使用相同的工具,就像您不使用JPA:SQL脚本,或更高级的模式和数据迁移工具,甚至是自定义迁移JDBC代码一样。

答案 1 :(得分:4)

看看flyway。您可以从代码或maven中触发数据库迁移。

答案 2 :(得分:0)

有一个名为hbm2ddl.auto=update的属性会更新您的架构。 我强烈建议不要在生产中使用此设置,因为如果出现问题,它会引入一个全新的问题。 这对于开发来说非常好。

答案 3 :(得分:0)

当JPA容器启动时(例如,EclipseLink或任何其他容器),它希望找到一个与您在代码中定义的@Entity类匹配的数据库。如果数据库已经迁移,一切都会顺利进行;否则:可能它会失败。

因此,长话短说,您需要在 JPA容器启动之前执行数据库迁移(或者,如果您愿意,可以进行演变)。显然,在Play启动您配置的数据库管理器之前,Play会为您执行迁移。因此,理论上,无论您使用的是ORM,Play都会决定ORM何时开始工作。所以,从概念上讲它应该有用。

有关此主题的精彩演示,请查看第二个视频:http://flywaydb.org/documentation/videos.html