使用hibernate更新数据库模式

blo*_*low 12 java hibernate hbm2ddl

<property name="hibernate.hbm2ddl.auto">update</property>
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢.

Dan*_*iel 8

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

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

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


che*_*vim 5

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


Ste*_*ins 5

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

  • Fletch - 我已经使用了多年,它与数据库无关,但如果你将<sql>硬编码到一个特定的数据库,那么它就不会.尝试使用像<插入> <更新>这样的xml节点...然后它将为您翻译. (2认同)