JPA / Hibernate поддержка миграции? - PullRequest
24 голосов
/ 13 октября 2010

В настоящее время я работаю над настольным приложением, использующим JPA / Hibernate для сохранения данных в базе данных H2. Мне любопытно, какие у меня есть варианты, если по какой-то причине мне понадобится внести изменения в схему базы данных в будущем. Возможно, мне придется вводить новые объекты, удалять их или просто изменять типы свойств объекта.

  • Есть ли в JPA / Hibernate поддержка для этого?
  • Должен ли я вручную написать сценарий решения?

Ответы [ 3 ]

21 голосов
/ 13 октября 2010

Я обычно позволяю Hibernate генерировать DDL во время разработки, а затем создаю сценарий переноса SQL вручную при развертывании на тестовом сервере (который я позже использую также для UAT и живых серверов).

Генерация DDL в Hibernate вообще не поддерживает перенос данных, если вы только добавляете ненулевое поле, генерация DDL вам не поможет.

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

Существует несколько библиотек (см. этот вопрос SO для примеров), но когда вы делаете что-то вроде разделения существующей сущности на иерархию с использованием объединенного наследования, вы всегда вернуться к простому SQL.

7 голосов
/ 13 октября 2010

Возможно, мне придется ввести новые сущности, удалить их или просто изменить типы свойств в сущности.

У меня нет никакого опыта с этим, но Liquibase предоставляетнекоторые Hibernate Integration и могут сравнивать ваши сопоставления с базой данных и генерировать соответствующий журнал изменений:

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

Все еще ищете возможность поиграть с ним и найти ответы на мои ожидающие вопросы:

  • это работает при использовании аннотаций?
  • делаетдля этого требуется файл hibernate.cfg.xml (хотя это не будет большим препятствием)?

Обновление: Хорошо, оба вопроса отвечает Натан Воксланд в этот ответ , и ответы:

  • да работает при использовании аннотаций
  • да требуется hibernate.cfg.xml (пока)
2 голосов
/ 13 октября 2010

Есть два варианта:

  • db-to-hibernate - зеркальное изменение БД для ваших сущностей вручную. Это означает, что ваша БД "лидирует"
  • hibernate-to-db - либо используйте hibernate.hbm2ddl.auto=update, либо вручную измените БД после изменения вашей сущности - здесь ваша объектная модель «ведёт»
...