31

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

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

3 回答 3

24

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

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

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

有许多库(请查看此 SO question以获取示例),但是当您执行诸如使用联合继承将现有实体拆分为层次结构之类的操作时,您总是会回到纯 SQL。

于 2010-10-13T12:40:18.907 回答
7

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

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

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

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

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

更新:好的,Nathan Voxland 在本回复中涵盖了这两个问题,答案是:

  • yes it works when using annotations
  • yes it requires an hibernate.cfg.xml (for now)
于 2010-10-13T15:46:15.037 回答
2

有两种选择:

  • db-to-hibernate - 手动将数据库更改镜像到您的实体。这意味着您的数据库处于“领先地位”
  • hibernate.hbm2ddl.auto=updatehibernate-to-db -在更改实体后使用或手动更改数据库 - 这里您的对象模型是“领先的”
于 2010-10-13T12:49:34.643 回答