13
<property name="hibernate.hbm2ddl.auto">update</property>

我可以创建我的数据库模式,它会自动添加属性、约束、键等……但是更新数据库模式呢?如果我从我的实体中删除一些属性,hibernate 不会删除它,或者如果我更改了一些约束,hibernate 不会触及已经创建的约束...

那么,有没有办法让hibernate真正更新数据库模式呢?

谢谢。

4

5 回答 5

8

我们为自己创建了一个工具,它创建必要的数据库列和表删除,并将这些删除添加到为数据库更新生成的 SQL 中。但是我们必须在 SchemaUpdate 生成中添加一些额外的东西才能使其工作:

  • 我们必须添加对非空属性的检查。这包括对数据发出 UPDATE 语句以尽可能消除空值,从而导致下一个默认值点。
  • 我们必须添加对列默认值的检查。默认值由列的可空性及其数据类型推断。基元总是初始化为零或假,非空枚举为其第一个枚举值,但对于其他对象,必须手动修改脚本。
  • 我们甚至添加了对调整 varchar 列大小的支持,因为在某些情况下数据库列的长度会@Column(length)有所不同。

但总而言之,这样无法创建完整的工具,因为如果在代码中重命名列怎么办?如果类型以一种无法自动转换的方式更改(bool to date?)怎么办?如果您无权访问重构历史记录,则无法始终传播更改。

于 2011-01-09T15:24:30.017 回答
5

不,那里没有。hbm2ddl 并不意味着对您的架构迁移进行完整的管理。最好仅将它用于对架构进行附加更改并手动编辑(生成的脚本)用于其他任何内容。

于 2011-01-01T23:47:16.137 回答
5

我们目前使用liquibase以与数据库无关的方式进行自动数据库更改。可以直接从您的休眠注释中提取 liquibase 命令,但我认为不存在这样的工具,因此您可能必须自己做。

于 2011-01-06T15:06:55.167 回答
2

一些可能对管理架构更改有用的项目:

  • mybatis(在 SOW 上标记了 1049 个问题)
  • Liquibase(在 SOW 上标记了 663 个问题)
  • Flyway(在 SOW 上标记了 400 个问题)

您会发现另一个有用的资源是 Flyway 网站中的功能比较(那里还提到了其他相关项目)。

于 2015-01-20T21:20:20.473 回答
1

Hibernate 提供了一个名为 SchemaUpdate 的类,它能够将一组 hibernate 映射与数据库模式同步

旧帖子,但让社区知道它是否好:)

于 2011-01-06T14:45:57.010 回答