JPA/Hibernate是否支持迁移?

33

我目前正在使用JPA/Hibernate开发桌面应用程序,将数据持久化到H2数据库中。如果以后需要出于某种原因更改数据库模式,我想知道我的选择。也许我需要引入新的实体,删除它们或仅更改实体中属性的类型。

  • JPA/Hibernate是否支持此操作?
  • 我是否需要手动编写脚本来解决问题?

寻找2017年以后的答案。 - Alexander Mills
3个回答

24

在开发过程中,我通常会让Hibernate生成DDL,然后在部署到测试服务器时创建手动的SQL迁移脚本(稍后也会用于UAT和生产服务器)。

Hibernate中的DDL生成完全不支持数据迁移,如果你只是添加一个非空字段,DDL生成无济于事。

我还没有找到任何真正有用的迁移抽象来帮助解决这个问题。

有许多库(可以参考这个SO问题进行举例),但当你像使用联合继承将现有实体拆分成层次结构时,你总是需要回到普通的SQL。


这是一个老问题,但它一直被问到,或多或少。我会在这里提到http://mybatis.org/migrations-maven-plugin/usage.html,以备将来参考。它允许通过SQL进行数据库维护/版本控制-这也允许数据迁移。从现有/维护的数据库中,您可以使用Hibernate生成JPA实体。 - user625488
嘿,如果我们可以使用Hibernate-JPA创建数据库和其他东西,那么迁移工具的需求是什么?@user625488 - Ishan Garg
@IshanGarg 有时候我们需要对数据库进行更改,这可以让更改变得无缝。例如,添加/删除一个新表时,您不会想要删除整个数据库才能完成此操作。因此,迁移帮助您将其无缝集成到正在运行的数据库中。 - was1209

8
也许我需要引入新的实体,删除它们或者只是改变实体属性的类型。
我没有相关经验,但Liquibase提供了Hibernate Integration,可以将你的映射与数据库进行比较,并生成相应的变更日志:
LiquiBase-Hibernate集成记录了当前Hibernate映射所需的数据库更改,您可以在执行之前检查和修改更改日志文件。
仍在寻找机会来使用它并找到我的待定问题的答案:
- 当使用注释时是否有效? - 是否需要一个hibernate.cfg.xml文件(虽然这不会是一个大障碍)?

更新:好的,这两个问题都由Nathan Voxland在this response中回答了,答案是:

  • ,当使用注释时它可以工作
  • ,现在需要一个hibernate.cfg.xml文件

很酷,我实际上没有Hibernate映射文件,只有一个persistence.xml。 - willcodejavaforfood
@willcodejavaforfood 是的,我也是这样。但正如我所写的,我不确定它是否能够处理 persistence.xml(如果需要,我考虑生成一个 hibernate.cfg.xml 来测试它)。也许可以开一个新问题,Nathan Voxland(Liquibase 的创建者)会出现 :) - Pascal Thivent
根据这个问题(https://dev59.com/C3RA5IYBdhLWcg3w8SiJ you do need),你需要一个hibernate.cfg.xml文件,但你是对的,这不会是一个大问题。 - willcodejavaforfood
嘿,如果我们可以使用Hibernate-JPA创建数据库和其他东西,那么迁移工具的需求是什么? - Ishan Garg
@IshanGarg 无法通过hibernate-jpa迁移数据。如上所示,给出了一个简单的例子:如果向表中添加一个非空列,则仅使用hibernate-jpa迁移将不知道为现有记录在该列中放置什么。但是还有许多更复杂的情况:合并两个列或使用特定解析规则拆分列,在表中拆分记录为多个表等。对于任何这样的情况,您需要一些hibernate-jpa无法提供的东西。 - user625488

2

有两个选项:

  • db-to-hibernate - 手动将数据库更改反映到实体中。这意味着你的数据库是“主导的”
  • hibernate-to-db - 使用hibernate.hbm2ddl.auto=update,或在更改实体后手动更改数据库 - 这里你的对象模型是“主导的”

3
如果在生产环境中使用hbm2ddl=auto,那么你会自讨苦吃。请不要这样做。 - matt b
1
首先,没有hbm2ddl=auto,只有hbm2ddl.auto=update - 在生产环境中不应使用。 - Otto Allmendinger
1
@OttoAllmendinger,我会修复属性名称。我知道很多人说“不要在生产中使用”,但是如果您小心并拥有一个分阶段环境,这比支持迁移脚本要好得多。 - Bozho
对于新手来说,我们应该把hibernate.hbm2ddl.auto=update这行放在哪个文件中? - Alexander Mills
嘿,如果我们可以使用Hibernate-JPA创建数据库和其他东西,那么迁移工具的需求是什么? - Ishan Garg
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接