Поддержка JPA / Hibernate для миграции?

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

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

3 ответов


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

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

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

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


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

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

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

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

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

обновление: ОК, оба вопроса покрываются Нейтан Voxland в этот ответ и ответы на них:

  • да он работает при использовании аннотаций
  • да требуются гибернации.контекстно-свободная грамматика.xml (на данный момент)

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

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