Liquibase + Hibernate переименовать колонку
Я использую базу данных 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..
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>
В настоящее время вообще нет никакого способа, чтобы diff мог обнаружить, что изменение столбца было переименованием, а не удалением и созданием. Это верно для любой системы, которая создает изменения, используя diff, а не только Liquibase.
Представьте себя жидкой базой - вам дают две таблицы в состояниях, которые вы описываете. Как бы вы определили, что столбец был переименован, а один столбец удален, а другой столбец создан? Единственное, о чем я могу думать, это то, что нужно было бы взглянуть на содержимое столбцов и увидеть, что они "в основном одинаковые". В данном конкретном случае это невозможно, поскольку сравниваемые базы данных включают в себя базу данных, заполненную данными, а вторую - просто пустую базу данных в памяти, созданную Hibernate.