Liquibase + Hibernate переименовать столбец

Я использую базу данных H2 для хранения своих данных и liquibase (с плагином hibernate) для проверки различий между базой данных и проектом.

предположим, что у меня есть следующий код:

@Entity
public class myEntity{

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

}

База данных находится на месте и уже хранит некоторые данные.

Теперь, когда я переименовываю указанный выше столбец, т.е. из val в значение, и запускаю liquibase:diff, в журнале difflog предлагается удалить столбец «val» и добавить столбец «value».

Очевидно, это не то, что я хотел, потому что все данные, изначально хранившиеся в столбце «val», исчезнут.

Есть ли способ сообщить liquibase, что это не новый столбец, а старый переименованный столбец?

Я хочу запустить liquibase:diff, и сгенерированный diffLog должен автоматически содержать тег rename... для моего столбца, а не добавление... и удаление... один...


person Lamp3    schedule 14.09.2016    source источник
comment
Что происходит, когда вы гуглите для столбца переименования liquibase?   -  person JB Nizet    schedule 14.09.2016
comment
Я хорошо осведомлен о возможности вручную написать набор изменений, который точно соответствует тому, что я хочу (это уже показано в ответе ниже), но я хочу, чтобы liquibase автоматически создавала набор изменений переименования при столкновении с переименованным столбцом в моем код   -  person Lamp3    schedule 14.09.2016
comment
Для уточнения: я хочу запустить liquibase:diff, и сгенерированный diffLog должен содержать тег ‹rename...›, чего я не хочу, так это вручную добавлять тег ‹rename..›   -  person Lamp3    schedule 14.09.2016
comment
Это невозможно. если схема до этого была [a, b], а затем [d, e], она не может догадаться, что d — это новое имя a, что b исчез, а e — совершенно новый, совершенно другой столбец. Это может быть наоборот. Это может быть два переименования. Это может быть два удаления и 2 добавления. Это семантическая разница, и вы единственный, кто это знает. Так что вам нужно взять на себя управление и сказать тупому инструменту, что делать.   -  person JB Nizet    schedule 14.09.2016


Ответы (2)


Вы пытались использовать набор изменений следующим образом (или я неправильно понял вопрос)

   <changeSet author="liquibase-docs" id="renameColumn-example">
        <renameColumn columnDataType="int"
                newColumnName="value"
                oldColumnName="val"
                remarks="A change in names"
                schemaName="public"
                tableName="myEntity"/>
    </changeSet>
person Ramachandran.A.G    schedule 14.09.2016
comment
Проблема в том, что я не хочу вручную изменять difflog, я хочу, чтобы liquibase автоматически создавала этот конкретный набор изменений при столкновении с столбцом переименования в коде. - person Lamp3; 14.09.2016

В настоящее время у diff вообще нет возможности определить, что изменение столбца было переименованием, а не удалением и созданием. Это верно для любой системы, которая создает изменения с помощью различий, а не только для Liquibase.

Представьте себя в роли ликвибаса — вам даны две таблицы, которые находятся в тех состояниях, которые вы описываете. Как бы вы определили, что столбец был переименован, а не один столбец удален, а другой создан? Единственное, что я могу придумать, это то, что нужно было бы посмотреть на содержимое столбцов и увидеть, что они «в основном одинаковы». В данном конкретном случае это невозможно, потому что сравниваемые базы данных включают одну, заполненную данными, и вторую, которая является просто пустой базой данных в памяти, созданной Hibernate.

person SteveDonie    schedule 14.09.2016