使用hibernate更新数据库模式

时间:2011-01-01 16:52:52

标签: java hibernate hbm2ddl

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

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

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

感谢。

5 个答案:

答案 0 :(得分:7)

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

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

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

答案 1 :(得分:5)

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

答案 2 :(得分:3)

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

答案 3 :(得分:2)

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

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

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

答案 4 :(得分:1)

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

Old post,但让社区知道它是否有用:)