【发布时间】:2011-04-24 19:50:35
【问题描述】:
我目前正在开发一个使用 JPA/Hibernate 将数据持久保存在 H2 数据库中的桌面应用程序。如果将来出于某种原因需要更改数据库模式,我很好奇我的选择是什么。也许我必须引入新实体、删除它们或者只是更改实体中的属性类型。
- JPA/Hibernate 是否支持这样做?
- 是否必须手动编写解决方案脚本?
【问题讨论】:
-
寻找比 2017 年更新的答案
我目前正在开发一个使用 JPA/Hibernate 将数据持久保存在 H2 数据库中的桌面应用程序。如果将来出于某种原因需要更改数据库模式,我很好奇我的选择是什么。也许我必须引入新实体、删除它们或者只是更改实体中的属性类型。
【问题讨论】:
有两种选择:
hibernate.hbm2ddl.auto=update,要么在更改实体后手动更改数据库 - 这里你的对象模型是“领先的”【讨论】:
hbm2ddl=auto,否则你会自找麻烦。
也许我必须引入新实体、删除它们或只是更改实体中的属性类型。
我对此没有任何经验,但 Liquibase 提供了一些 Hibernate Integration 并且可以将您的映射与数据库进行比较并生成适当的更改日志:
LiquiBase-Hibernate 集成将当前 Hibernate 映射所需的数据库更改记录到更改日志文件中,然后您可以在执行之前根据需要检查和修改该文件。
仍在寻找机会玩它并找到一些未决问题的答案:
hibernate.cfg.xml 文件(尽管这不会是一个很大的障碍)? 更新:好的,Nathan Voxland 在this response 中讨论了这两个问题,答案是:
【讨论】:
我通常让 Hibernate 在开发期间生成 DDL,然后在部署到测试服务器时创建手动 SQL 迁移脚本(我后来也将其用于 UAT 和实时服务器)。
Hibernate 中的 DDL 生成根本不提供数据迁移的支持,如果你只是添加一个非空字段,DDL 生成将无济于事。
我还没有找到任何真正有用的迁移抽象来帮助解决这个问题。
有许多库(例如,请查看 this SO question),但是当您使用联合继承将现有实体拆分为层次结构时,您总是回到普通 SQL。
【讨论】: