使用休眠更新数据库架构


问题内容
<property name="hibernate.hbm2ddl.auto">update</property>

我可以创建我的数据库架构,它会自动添加属性,约束,键等。但是,更新数据库架构又如何呢?如果我从实体中删除了某些属性,休眠则不会删除它,或者如果我更改了某些约束,则休眠不会触及已经创建的约束…

那么,有没有一种方法可以使休眠状态真正更新数据库架构?

谢谢。


问题答案:

我们为自己创建了一个工具,该工具创建了必要的数据库列和表,并将其添加到为数据库更新生成的SQL中。但是我们必须在SchemaUpdate生成中添加一些附加功能,以使其工作:

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

但是总的来说,不能用这种方式创建一个完整的工具,因为如果用代码重命名一个列怎么办?如果类型以无法自动转换的方式更改(布尔型至今)?如果您无权访问重构历史记录,则无法始终传播更改。