5

H2 データベースを使用してデータを保存し、liquibase (hibernate プラグインを使用) を使用してデータベースとプロジェクトの違いを確認しています。

次のコードがあるとします。

@Entity
public class myEntity{

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

}

データベースは適切に配置されており、すでに一部のデータが保存されています。

上記の列の名前を val から value に変更し、liquibase:diff を実行すると、difflog は列 "val" を削除して列 "value" を追加するように指示します。

「val」列に最初に格納されたすべてのデータがなくなるため、明らかにこれは私が望んでいたことではありません。

新しい列ではなく、名前が変更された古い列であることをliquibaseに伝える方法はありますか?

liquibase:diff を実行したいのですが、生成された diffLog には、add.. や drop.. one.. ではなく、列の rename... タグが自動的に含まれているはずです。

4

2 に答える 2

4

次のように変更セットを使用してみましたか (または質問が間違っていましたか)

   <changeSet author="liquibase-docs" id="renameColumn-example">
        <renameColumn columnDataType="int"
                newColumnName="value"
                oldColumnName="val"
                remarks="A change in names"
                schemaName="public"
                tableName="myEntity"/>
    </changeSet>
于 2016-09-14T06:56:31.590 に答える
1

現在、一般に、列の変更がドロップ アンド クリエイトではなく名前の変更であったことを差分で検出できる方法はありません。これは、Liquibase だけでなく、差分を使用して変更を作成するすべてのシステムに当てはまります。

自分が liquibase だと想像してみてください。説明した状態にある 2 つのテーブルが与えられます。列の名前が変更されたことと、一方の列が削除されてもう一方の列が作成されたことをどのように判断しますか? 私が考えることができる唯一のことは、列の内容を見て、それらが「ほとんど同じ」であることを確認する必要があるということです. この特定のケースでは、比較されているデータベースには、データが入力されているデータベースと、Hibernate によって作成された空のインメモリ データベースである 2 番目のデータベースが含まれているため、これは不可能です。

于 2016-09-14T15:01:03.180 に答える