Java 使用hibernate更新数据库架构 更新
我可以创建我的数据库模式,它会自动添加属性、约束、键等。。。 但是如何更新数据库模式呢? 若我从实体中删除了一些属性,hibernate不会删除它,或者若我更改了一些约束,hibernate不会触及已经创建的约束 那么,有没有办法让hibernate真正更新数据库模式Java 使用hibernate更新数据库架构 更新,java,hibernate,hbm2ddl,Java,Hibernate,Hbm2ddl,我可以创建我的数据库模式,它会自动添加属性、约束、键等。。。 但是如何更新数据库模式呢? 若我从实体中删除了一些属性,hibernate不会删除它,或者若我更改了一些约束,hibernate不会触及已经创建的约束 那么,有没有办法让hibernate真正更新数据库模式 谢谢。没有。hbm2ddl并不意味着要对模式迁移进行完整的管理。最好只将其用于模式的附加更改,而手动编辑(生成的脚本)用于其他任何操作。Hibernate提供了一个名为SchemaUpdate的类,该类能够将一组Hibernate
谢谢。没有。hbm2ddl并不意味着要对模式迁移进行完整的管理。最好只将其用于模式的附加更改,而手动编辑(生成的脚本)用于其他任何操作。Hibernate提供了一个名为SchemaUpdate的类,该类能够将一组Hibernate映射与数据库模式同步
,但请让社区知道它是否好:)我们目前使用的方法是以数据库不可知的方式自动更改数据库。可以直接从hibernate注释中提取liquibase命令,但我不认为存在这样的工具,因此您可能需要自己来做。我们为自己创建了一个工具,它创建必要的数据库列和表拖放,并将这些拖放添加到为数据库更新生成的SQL中。但是我们必须在SchemaUpdate生成中添加一些额外的内容以使其正常工作:
- 我们必须为非空属性添加检查。这包括对数据发出UPDATE语句,在可能的情况下删除空值,从而得到下一个默认值点
- 我们必须添加对列的默认值的检查。默认值由列及其数据类型的可空性推断。原语总是初始化为零或false,而不是将null枚举初始化为其第一个枚举值,但对于其他对象,必须手动修改脚本
- 我们甚至添加了对调整varchar列大小的支持,因为在某些情况下,数据库列长度和
不同@column(length)
但总而言之,一个完整的工具不能以这种方式创建,因为如果一个列在代码中被重命名会怎么样?如果类型以无法自动转换的方式更改(bool至今?),该怎么办。如果您无权访问重构历史记录,则无法始终传播更改。一些可能有助于管理架构更改的项目:
- (SOW上标注了1049个问题)
- (663个问题贴在工作说明书上)
- (SOW上标注了400个问题)
另一个你可以找到的有用资源是Flyway网站上的(这里提到了其他相关项目)。你说liquibase是数据库不可知论是什么意思?我试图在一个RDBMS上运行一个在另一个RDBMS上生成的liquibase变更集(即数据库程序),但它不起作用。Fletch-我已经使用它很多年了,它与数据库无关,但如果你硬编码到一个特定的数据库,它就不会起作用。尝试使用xml节点,如。。。然后它会为你翻译。这个链接似乎被破坏了,至少它没有为我显示任何内容,只有文章的标题。
<property name="hibernate.hbm2ddl.auto">update</property>