【问题标题】:Liquibase + Hibernate rename columnLiquibase + Hibernate 重命名列
【发布时间】:2016-09-14 06:51:09
【问题描述】:

我正在使用 H2 数据库来存储我的数据,并使用 liquibase(带有 hibernate 插件)来检查数据库和 projet 之间的差异。

假设我有以下代码:

@Entity
public class myEntity{

    @Column(name="val")
    private int value;

}

数据库已经就位,并且已经存储了一些数据。

现在,当我重命名上述列,即从 val 到 value 并运行 liquibase:diff 时,difflog 说删除列“val”并添加列“value”。

显然这不是我想要的,因为原来存储在“val”列中的所有数据都会消失。

有没有办法告诉 liquibase 它不是一个新列,而是一个旧的重命名列?

我想运行 liquibase:diff 并且生成的 diffLog 应该自动包含我的列的 rename... 标签,而不是 add.. 和 drop.. one..

【问题讨论】:

  • 当你用谷歌搜索“liquibase rename column”时会发生什么?
  • 我很清楚手动编写一个完全符合我想要的事情的变更集的可能性(它已经在下面的答案中显示),但我希望 liquibase 自动创建重命名变更集在我的代码中遇到重命名的列时
  • 要校准:我想运行 liquibase:diff 并且生成的 diffLog 应该包含 标签,我不希望我必须手动添加 标签
  • 不能。如果之前的模式是 [a, b] 然后是 [d, e],它无法猜测 d 是 a 的新名称,b 已经消失,而 e 是一个全新的、完全不同的列。它可能是反向的。可能是两个重命名。它可能是两个删除和两个添加。这是语义上的差异,您是唯一知道这一点的人。因此,您需要掌握控制权,并告诉愚蠢的工具该做什么。

标签: java hibernate jpa liquibase liquibase-hibernate


【解决方案1】:

您是否尝试使用如下变更集(或者我的问题是否有误)

   <changeSet author="liquibase-docs" id="renameColumn-example">
        <renameColumn columnDataType="int"
                newColumnName="value"
                oldColumnName="val"
                remarks="A change in names"
                schemaName="public"
                tableName="myEntity"/>
    </changeSet>

【讨论】:

  • 问题是我不想手动更改 difflog,我想要的是 liquibase 在遇到代码中的重命名列时自动创建特定的变更集
【解决方案2】:

目前一般来说,差异无法检测到列更改是重命名而不是删除和创建。对于使用差异创建更改的任何系统都是如此,而不仅仅是 Liquibase。

将自己想象成 liquibase - 给您两张处于您所描述状态的表格。您如何确定一列已重命名与删除一列并创建另一列?我能想到的唯一一件事是需要查看列的内容,看看它们“基本相同”。在这种特殊情况下,这是不可能的,因为要比较的数据库包括一个填充了数据的数据库和一个只是由 Hibernate 创建的空内存数据库。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 2015-05-05
    • 1970-01-01
    • 1970-01-01
    • 2017-04-05
    • 1970-01-01
    相关资源
    最近更新 更多