使用Hibernate更新数据库架构

13
<property name="hibernate.hbm2ddl.auto">update</property>
我可以创建我的数据库模式,它会自动添加属性、约束、键等等... 但是如果我更新数据库模式呢? 如果我从实体中删除某些属性,Hibernate 不会将其删除,或者如果我更改某些约束,Hibernate 不会触及已经创建的约束...
那么,有没有办法让 Hibernate 真正更新数据库模式呢?
谢谢。
5个回答

8
我们创建了一个工具,用于创建数据库列和表的必要删除,并将这些删除添加到用于数据库更新的SQL中生成。但是我们不得不添加一些额外的内容到SchemaUpdate生成中使其正常工作:
  • 我们必须添加非空属性检查。这包括在数据上发出UPDATE语句以消除可能存在的null值,导致默认值的下一个点。
  • 我们必须添加列的默认值检查。默认值由列的可空性和其数据类型推断出来。基元类型始终初始化为零或false,非空枚举类型始终初始化为其第一个枚举值,但对于其他对象,脚本必须手动修改。
  • 我们甚至添加了调整varchar列大小的支持,因为有时数据库列长度和@Column(length)不同。

但是,要将所有内容整合在一起,不能仅仅通过这种方式创建完整的工具,因为如果代码中重命名了某个列会怎么样?如果类型更改而不是自动转换(bool到date?)如果您没有访问重构历史记录,则无法始终传播更改。


5

没有。hbm2ddl不是用于完全管理模式迁移的工具。最好只在模式有增量变化时使用它,对于其他任何更改请手动编辑生成的脚本。


5

我们目前使用Liquibase来以数据库无关的方式进行自动数据库更改。也许可以直接从您的Hibernate注释中提取Liquibase命令,但我认为这样的工具不存在,所以您可能需要自己完成。


你说liquibase是数据库无关的,这是什么意思?我试图在另一个RDBMS(即数据库程序)上运行在一个RDBMS上生成的liquibase变更集,但它没有起作用。 - Fletch
2
Fletch - 我已经使用它多年了,它不依赖于特定的数据库,但如果你将你的<sql>硬编码到特定的数据库中,那么它就不会是这样了。尝试使用像<insert> <update>这样的xml节点,然后它就可以为你翻译了。 - csharp4me

2
一些可能有用于管理模式更改的项目:
  • mybatis(在SOW上标记了1049个问题)
  • Liquibase(在SOW上标记了663个问题)
  • Flyway(在SOW上标记了400个问题)

您还可以在Flyway网站上找到功能比较,这可能是另一个有用的资源(那里提到了其他相关项目)。


1
Hibernate提供了一个名为SchemaUpdate的类,它能够将一组Hibernate映射与数据库模式同步。 旧帖子,但让社区知道它是否好用 :)

1
这个链接似乎出了问题,至少对我来说它没有展示任何内容,只有文章的标题。 - Hola Soy Edu Feliz Navidad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接