2015-09-17 3 views
3

Я прочитал discussion about using hbm2ddl.auto=update, чтобы автоматически обновлять изменения в схеме базы данных.Как правильно обновить приложения Hibernate?

Тема с 2008 года, и я не знаю, насколько безопасно использовать режим автоматического обновления сегодня.

Мы запускаем небольшой JavaEE на Glassfish с Hibernate 4.3.11 и PostgreSQL. Мы планируем использовать непрерывную интеграцию с Дженкинсом.

Полезно ли работать с hbm2ddl.auto = обновление включено? Или лучше использовать легкую альтернативу для обновления/проверки обновлений, возможно, вручную?

Я знаю, что сложно дать общее заявление.

ответ

5

Вы не должны использовать hbm2ddl.auto=update для обновления производственных баз данных.

Несколько причин:

  • Hibernate только ВСТАВКУ недостающих столбцов, а не изменять существующие столбцы. Поэтому, если переименовать свойство (Client для клиентов), Hibernate будет создать новый столбец Клиент, оставив столбец Client нетронутым. Вам нужно вручную «переместить» данные там и удалить столбец-сирота.
  • Hibernate не будет удалять ограничения на более не отображаемые столбцы. Таким образом, если ваш столбец был NOT NULL, то любой запрос на вставку к этой таблице теперь будет терпеть неудачу в первую очередь, потому что Hibernate не предоставит никаких данных для столбца сирота (который все еще имеет ограничение NOT NULL).
  • Hibernate не будет касаться типов данных существующих столбцов. Итак, если вы измените тип свойства с String на Дата - Hibernate оставит определение столбца как varchar.
  • Hibernate не удаляет столбцы, из которых вы удалили это свойство, что привело к загрязнению данных и наихудшему (ограничения остаются в силе) к уже не работающим приложениям.
  • Если вы создаете additiional constriants для существующих столбцов - hibernate не будет их создавать, потому что столбец уже существовал раньше. (Вы можете пропустить важные контрсилы на производстве дб вы добавили на существующих столбцах)

Таким образом, выполнять свои обновления по своему усмотрению является безопаснее. Если вам нужно учитывать, что делает спящий режим, а что нет - вам лучше делать это самостоятельно с нуля.

+0

Спасибо за ваш ответ. Как выполнять эти обновления вручную? Должен ли я каждый раз менять каждую таблицу с помощью операторов SQL или подобных? – Marcel

+0

@Marcel IT зависит. У нас есть версия SQL-файла с версией, содержащая все необходимые изменения в правильном порядке. Это нормально, если база данных вряд ли изменится, что не должно быть на ранних этапах приложения. – dognose

+0

@ dognose, не могли бы вы поделиться источником ответа? –

Смежные вопросы