有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Hibernate hbm2ddl。自动更新不会删除mysql中的列

它增加了新的,但据我所知,它没有放弃旧的

当我说旧的时,我指的是实体对象的属性,它们现在被完全删除了,而以前它们是存在的,并用@column注释的

手动删除列或将配置值更改为create是我唯一的选择吗?两者都不是特别迷人

还是别的什么


共 (2) 个答案

  1. # 1 楼答案

    我想研究一下liquibase如何使您的数据库与您的Enities保持同步。也许有点过分,但很值得

  2. # 2 楼答案

    无论如何,永远不要使用hbm2ddl。在任何实时/生产数据库上自动

    是的,“更新”不会删除任何未引用的列(可能是为了允许您使用“遗留”数据库,这些数据库中的列不被您的hibernate应用程序使用,但可能被外部应用程序使用),这就是“按预期工作”。但是,在某些情况下,如果您更改实体中的数据类型,hibernate可以删除并重新创建列。这是您不应该在任何生产系统中使用它的原因之一

    就我个人而言,我决不会相信一个自动化的“黑盒”框架能够在严格意义上的本地/开发环境中处理对数据模型的更改。我一直在设置它,以便在本地开发环境中,您可以创建drop。一旦开始将您的应用程序升级到中央测试/阶段,然后再升级到prod,所有数据库更改都由DBA:s使用老式的DDL脚本完成。在hibernate(或任何其他ORM/automated框架)中,数据的价值太大,不可能导致潜在的bug或意外行为。我甚至确保在我的应用程序中配置的数据库用户在数据库中甚至没有创建/删除/更改权限,只是为了防止由于hibernate中的错误配置而发生灾难

    所以,为了回答您的问题——如果您希望hibernate始终维护能够准确反映您的实体的数据库,“createdrop”是您唯一的选择。只是不要在本地开发人员数据库之外的任何地方使用它