Обновить схему базы данных с помощью Hibernate - PullRequest
12 голосов
/ 01 января 2011
<property name="hibernate.hbm2ddl.auto">update</property>

Я могу создать свою схему базы данных, она автоматически добавляет свойства, ограничения, ключ и т. Д. Но как насчет ОБНОВЛЕНИЯ схемы базы данных?Если я удаляю какое-либо свойство из своих сущностей, hibernate не удаляет его, или если я изменяю какое-то ограничение, hibernate не затрагивает уже созданное ограничение ...

Итак, есть способ сделать hibernate действительнообновить схему базы данных?

Спасибо.

Ответы [ 5 ]

7 голосов
/ 09 января 2011

Мы создали собственный инструмент, который создает необходимые отбрасывания столбцов и таблиц базы данных и добавляет эти отбрасывания в SQL, сгенерированный для обновлений базы данных. Но мы должны были добавить некоторые дополнения к генерации SchemaUpdate, чтобы заставить его работать:

  • Нам пришлось добавить проверки для ненулевых свойств. Это включает в себя выполнение оператора UPDATE для данных, чтобы по возможности исключать значения NULL, что приводит к следующей точке значений по умолчанию.
  • Нам пришлось добавить проверки для значений столбцов по умолчанию. Значения по умолчанию определяются обнуляемостью столбца и его типом данных. Примитивы всегда инициализируются нулями или ложными, ненулевые перечисления равны первому значению перечисления, но для других объектов скрипт должен быть изменен вручную.
  • Мы даже добавили поддержку изменения размера столбцов varchar, потому что были случаи, когда длина столбца базы данных и @Column(length) отличались.

Но, если сложить все вместе, полный инструмент не может быть создан таким образом, потому что, если столбец переименован в коде? Что, если тип изменяется не автоматически конвертируемым образом (bool to date?). Если у вас нет доступа к истории рефакторинга, вы не всегда можете распространять изменения.

5 голосов
/ 06 января 2011

В настоящее время мы используем liquibase для автоматического изменения базы данных независимо от базы данных.Может быть возможно извлечь команды liquibase непосредственно из ваших спящих аннотаций, но я не думаю, что такой инструмент существует, поэтому вам, вероятно, придется делать это самостоятельно.

4 голосов
/ 02 января 2011

нет там нет.hbm2ddl не предназначен для полного управления миграциями вашей схемы.Лучше всего использовать его только для аддитивных изменений в вашей схеме и ручного редактирования (сгенерированных скриптов) для всего остального.

2 голосов
/ 21 января 2015

Некоторые проекты, которые могут быть полезны для управления изменениями схемы:

  • mybatis (1049 вопросов, помеченных на SOW)
  • Liquibase (663 вопроса, помеченные на SOW)
  • Flyway (400 вопросов с тегом SOW)

Еще один полезный ресурс - это сравнение функций на веб-сайте Flyway (там упоминаются и другие связанные проекты).

1 голос
/ 06 января 2011

Hibernate предоставляет класс SchemaUpdate, который может синхронизировать набор отображений hibernate со схемой базы данных

Старый пост , но сообщите сообществу, если это хорошо:)

...