【问题标题】:Update database schema with hibernate使用休眠更新数据库模式
【发布时间】:2011-06-02 06:23:31
【问题描述】:
<property name="hibernate.hbm2ddl.auto">update</property>

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

那么,有没有办法让hibernate真正更新数据库架构?

谢谢。

【问题讨论】:

    标签: java hibernate hbm2ddl


    【解决方案1】:

    不,没有。 hbm2ddl 并不意味着对您的架构迁移进行完整的管理。最好仅将其用于对架构进行附加更改,并手动编辑(生成的脚本)以进行其他任何操作。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 这个链接好像坏了,至少对我来说它没有显示任何内容,只有文章的标题。
      【解决方案3】:

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

      【讨论】:

      • 你说 liquibase 与数据库无关是什么意思?我尝试在另一个 RDBMS(即数据库程序)上运行在一个 RDBMS 上生成的 liquibase 变更集,但它不起作用。
      • Fletch - 我已经使用了多年,它与数据库无关,但如果你将 硬编码到特定的数据库,那么它就不会了。尝试使用像 这样的 xml 节点...然后它会为你翻译。
      【解决方案4】:

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

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

      但总而言之,无法通过这种方式创建完整的工具,因为如果在代码中重命名列会怎样?如果类型以一种无法自动转换的方式更改(bool to date?)怎么办?如果您无权访问重构历史记录,则无法始终传播更改。

      【讨论】:

        【解决方案5】:

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

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

        另一个有用的资源是 Flyway 网站上的 feature comparison(那里提到了其他相关项目)。

        【讨论】:

          猜你喜欢
          • 2013-04-01
          • 1970-01-01
          • 2012-09-18
          • 2015-03-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-20
          • 2015-06-08
          相关资源
          最近更新 更多