Как обновить схему базы данных, не теряя свои данные с Hibernate? - PullRequest
24 голосов
/ 10 апреля 2009

Представьте, что вы разрабатываете приложение Java EE с использованием Hibernate и JBoss. У вас есть работающий сервер, на котором есть важные данные. Вы выпускаете следующую версию приложения время от времени (1-2 недели), и в слое постоянства появляется куча изменений:

  • Новые лица
  • Удаленные объекты
  • Изменения типа атрибута
  • Изменение имени атрибута
  • Изменение отношений

Как эффективно настроить систему, которая обновляет схему базы данных и сохраняет данные? Насколько я знаю (возможно, я ошибаюсь), Hibernate не выполняет изменение столбца, удаление / изменение ограничения.

Спасибо, Артем Б.

Ответы [ 8 ]

17 голосов
/ 15 апреля 2009

LiquiBase - ваш лучший выбор. Он имеет режим интеграции hibernate , который использует hbm2ddl Hibernate для сравнения вашей базы данных и вашего отображения hibernate, но вместо автоматического обновления базы данных он выводит файл журнала изменений в liquibase, который можно проверить перед фактическим запуском.

Будучи более удобным, любой инструмент, который сравнивает вашу базу данных и ваши отображения в спящем режиме, может ошибаться. См. http://www.liquibase.org/2007/06/the-problem-with-database-diffs.html для примеров. С помощью liquibase вы создаете список изменений базы данных по мере разработки в формате, который может выдержать код с ответвлениями и слияниями.

4 голосов
/ 28 октября 2017

Вы можете использовать инструмент https://github.com/Devskiller/jpa2ddl, который предоставляет подключаемые модули Maven и Gradle и способен генерировать автоматические миграции схем для Flyway на основе сущностей JPA. Он также включает в себя все свойства, диалекты, пользовательские типы, стратегии именования и т. Д.

3 голосов
/ 10 апреля 2009
3 голосов
/ 10 апреля 2009

Я лично отслеживаю все изменения в сценарии миграции SQL.

2 голосов
/ 17 июля 2014

В качестве дальнейшего ответа на то, что Натан Воксланд сказал о LiquiBase , ниже приведен пример выполнения миграции под Windows для базы данных mySql:

Поместите соединитель mysql в папку lib в дистрибутиве liquibase, например.

Создайте файл свойств liquibase.properties в корне дистрибутива liquibase и вставьте следующие повторяющиеся строки:

driver: com.mysql.jdbc.Driver
classpath: lib\\mysql-connector-java-5.1.30.jar
url: jdbc:mysql://localhost:3306/OLDdatabase
username: root
password: pwd

Создание или получение обновленной базы данных под другим именем, например NEWdatabase .

Теперь вы извлечете различия в файле Migration.xml с помощью следующей командной строки:

liquibase diffChangeLog --referenceUrl="jdbc:mysql://localhost:3306/NEWdatabase" 
--referenceUsername=root --referencePassword=pwd > C:\Users\ME\Desktop\Migration.xml

Наконец, запустите обновление, используя только что сгенерированный Migration.xml файл:

java -jar liquibase.jar --changeLogFile="C:\Users\ME\Desktop\Migration.xml" update

Примечание: все эти командные строки должны выполняться из домашнего каталога liquibase, в котором находятся liquibase.bat / .sh и liquibase.jar.

2 голосов
/ 11 апреля 2009

Для одного приложения я использую SchemaUpdate, встроенную в Hibernate, прямо из класса начальной загрузки, поэтому схема проверяется при каждом запуске приложения. Это заботится о добавлении новых столбцов или таблиц, что в основном происходит со зрелым приложением. Для обработки особых случаев, таких как удаление столбцов, загрузчик просто вручную запускает ddl в try / catch, поэтому, если он уже был удален один раз, он просто молча выдает ошибку. Я не уверен, что сделал бы это с критически важными данными в производственном приложении, но за несколько лет и сотни развертываний у меня никогда не было проблем с этим.

1 голос
/ 11 апреля 2009

Я использую задачу муравья hbm2ddl для генерации моего ddl. Существует опция, которая будет выполнять изменение таблиц / столбцов в вашей базе данных.

Пожалуйста, смотрите атрибут "update" задачи муравья hbm2ddl:

http://www.hibernate.org/hib_docs/tools/reference/en/html/ant.html#d0e1137

update (по умолчанию: false): попробуйте и создайте скрипт обновления, представляющий «дельта» между тем, что находится в база данных и какие сопоставления уточнить. Игнорирует создание / обновление атрибутов. (Не используйте против производственные базы данных, никаких гарантий на все, что может быть правильной дельтой сгенерированный ни что лежащее в основе База данных может фактически выполнить необходимые операции)

0 голосов
/ 09 октября 2010

Вы также можете использовать DBMigrate . Это похоже на Liquibase:

Похоже на 'rake migrate' для Ruby в Rails эта библиотека позволяет вам управлять обновления базы данных для вашей Java приложения.

...