使用hibernate更新数据库模式

update 

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

那么,有一种方法可以让hibernate真正更新数据库模式吗?

谢谢。

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

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

但是要把它们放在一起,就不能用这种方式创建一个完整的工具,因为如果在代码中重命名了一个列呢? 如果类型以不可自动转换的方式更改(bool到日期?),该怎么办? 如果您无权访问重构历史记录,则无法始终传播更改。

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

不,那里没有。 hbm2ddl并不意味着对模式迁移进行全面管理。 最好只将它用于模式的附加更改,并手动编辑(生成的脚本)以用于其他任何操作。

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

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

您可以找到的另一个有用的资源是Flyway网站上的function比较 (还有其他相关项目)。

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

老post ,但让社区知道它是不是很好:)