Подтвердить что ты не робот

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

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

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

Ответ 1

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

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

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

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

Ответ 2

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

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

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

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

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

Обновление: Хорошо, оба вопроса покрыты Nathan Voxland в этом ответе, и ответы:

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

Ответ 3

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

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