【问题标题】:JPA/Hibernate support for migration?JPA/Hibernate 是否支持迁移?
【发布时间】:2011-04-24 19:50:35
【问题描述】:

我目前正在开发一个使用 JPA/Hibernate 将数据持久保存在 H2 数据库中的桌面应用程序。如果将来出于某种原因需要更改数据库模式,我很好奇我的选择是什么。也许我必须引入新实体、删除它们或者只是更改实体中的属性类型。

  • JPA/Hibernate 是否支持这样做?
  • 是否必须手动编写解决方案脚本?

【问题讨论】:

  • 寻找比 2017 年更新的答案

标签: java hibernate jpa h2


【解决方案1】:

有两种选择:

  • db-to-hibernate - 手动将数据库更改镜像到您的实体。这意味着您的数据库处于“领先地位”
  • hibernate-to-db - 要么使用hibernate.hbm2ddl.auto=update,要么在更改实体后手动更改数据库 - 这里你的对象模型是“领先的”

【讨论】:

  • hibernate.hbm2ddl=auto 可以在不搞砸数据库的情况下应对哪些变化? :)
  • 几乎所有。除了删除列,我猜,你必须自己删除它们。
  • 不要不要在生产环境中使用hbm2ddl=auto,否则你会自找麻烦。
  • 首先,没有 hbm2ddl=auto,只有 hbm2ddl.auto=update - 你不应该在生产中使用它
  • @OttoAllmendinger 我会修改该属性的名称。而且我知道很多人说“不要在生产中使用它”,但如果你小心并且有一个暂存环境,这是一个比支持迁移脚本更好的选择。
【解决方案2】:

也许我必须引入新实体、删除它们或只是更改实体中的属性类型。

我对此没有任何经验,但 Liquibase 提供了一些 Hibernate Integration 并且可以将您的映射与数据库进行比较并生成适当的更改日志:

LiquiBase-Hibernate 集成将当前 Hibernate 映射所需的数据库更改记录到更改日志文件中,然后您可以在执行之前根据需要检查和修改该文件。

仍在寻找机会玩它并找到一些未决问题的答案:

  • 使用注解时是否有效?
  • 它是否需要hibernate.cfg.xml 文件(尽管这不会是一个很大的障碍)?

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

  • 是的它在使用注释时有效
  • 是的它需要一个 hibernate.cfg.xml(目前)

【讨论】:

  • 酷,我实际上没有hibernate映射文件,只有一个persistence.xml
  • @willcodejavaforfood 是的,这里也一样。但正如我所写,我不确定它是否可以处理persistence.xml(我正在考虑生成一个hibernate.cfg.xml 以在需要时使用它)。也许打开另一个问题,Nathan Voxland(Liquibase 的创建者)会出现 :)
  • 根据这个[问题](stackoverflow.com/questions/776787/…你确实需要)你需要一个hibernate.cfg.xml但你是对的,这不会是一个大问题
  • 嘿,如果我们可以使用 hibernate-jpa 创建数据库和东西,那么迁移工具需要什么
  • @IshanGarg 数据无法通过 hibernate-jpa 迁移。上面给出了一个简单的例子:如果你向表中添加一个非空列,单独的 hibernate-jpa 迁移将不知道在该列中为现有记录添加什么。但是还有很多更复杂的情况:合并两列或使用特定的解析规则拆分列,将表中的记录拆分为多个表等。对于任何此类情况,您需要 hibernate-jpa 无法提供的东西。跨度>
【解决方案3】:

我通常让 Hibernate 在开发期间生成 DDL,然后在部署到测试服务器时创建手动 SQL 迁移脚本(我后来也将其用于 UAT 和实时服务器)。

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

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

有许多库(例如,请查看 this SO question),但是当您使用联合继承将现有实体拆分为层次结构时,您总是回到普通 SQL。

【讨论】:

  • 这是一个古老的问题,但它一直被问到,以一种或另一种方式。我会在这里提到mybatis.org/migrations-maven-plugin/usage.html,以供将来参考。它允许通过 SQL 进行数据库维护/版本控制——这也允许数据迁移。然后,您可以从现有/维护的数据库中使用 hibernate 生成 JPA 实体。
  • 嘿,迁移工具需要什么,我们可以使用 hibernate-jpa @user625488 创建数据库和东西
  • @IshanGarg 有时我们需要在数据库中进行更改,有助于使其无缝。例如,在添加/删除新表时,您不希望删除整个数据库来执行此操作。因此,迁移可帮助您将其无缝集成到正在运行的数据库中。
猜你喜欢
  • 1970-01-01
  • 2021-08-23
  • 2013-10-13
  • 2016-08-23
  • 2012-07-16
  • 1970-01-01
  • 2011-01-04
  • 1970-01-01
  • 2015-01-12
相关资源
最近更新 更多