Используйте hbm2ddl для генерации DDL SQL для обновления схемы базы данных (без потери данных) - PullRequest
0 голосов
/ 22 июня 2010

Я использовал hbm2ddl и hbm2java для создания своей базы данных и POJO для своего проекта на основе моих файлов сопоставления XML (hbm.xml).Сейчас я начинаю получать некоторые реальные данные в системе, поэтому повторный запуск моего скрипта ant, который удаляет базу данных и воссоздает все, больше не является жизнеспособным вариантом, поскольку я хочу сохранить данные.Я слышал, что есть функция hbm2ddl.auto, которую можно использовать для изменения структуры БД, не избавляясь от данных, но я понял из некоторых ответов о том, что это не лучшая практика.

Насколько я понимаю, вы должны написать SQL DDL на основе изменений в файле сопоставления и запустить его для БД.Мне было интересно, если hbm2ddl может быть использован для генерации этого DDL на основе файла сопоставления.Я также рассказал о LiquiBase, но не уверен, что они подойдут для моей ситуации, так как я надеюсь продолжать использовать файлы hbm.xml в качестве ключевого источника определения данных.

Комментарии и предложения приветствуются - заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 22 июня 2010

Я задавал мне тот же вопрос на прошлой неделе, и я решил использовать LiquiBase.Здесь есть много утверждений о «переполнении стека», которые не рекомендуют использовать hbm2ddl в производственных средах.Я тоже.

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

0 голосов
/ 22 июня 2010

Возможно, это не лучший способ сделать это в производственной среде, но если вы не «живете с тысячами пользователей», вот как это сделать:

  • установите hibernate.hbm2dll на update (это свойство гибернации, установите его в hibernate.cfg.xml или в конфигурации весны, если вы его используете)
  • каждый раз, когда вы (пере) запускаете свое приложение, схема базы данных будет обновляться с учетом новых полей и ограничений.
  • старые поля не могут быть удалены, поэтому вы можете пойти и почистить их вручную
  • , соответствующим столбцам с not null, следует присвоить default, или вы должны пойти и сделать ручной запрос UPDATE. В противном случае вы получите исключения во время выполнения.
...