Возможные значения конфигурации hbm2ddl.auto в Hibernate и их назначение
Я хочу лучше разобраться в параметре hibernate.hbm2ddl.auto
, особенно в значениях, которые ему могут быть присвоены, а также в операции обновления и экспорта.
Когда нужно использовать значение "update", а когда лучше этого избегать? Каковы альтернативы?
Расскажу о некоторых изменениях, которые могут происходить в базе данных:
- новые таблицы
- новые столбцы в существующих таблицах
- удаление столбцов
- изменение типа данных столбца
- изменение атрибутов столбца
- удаление таблиц
- изменение значений в столбце
В каждом из этих случаев каково наиболее подходящее решение?
5 ответ(ов)
Свойство конфигурации называется hibernate.hbm2ddl.auto
.
В нашей разработческой среде мы устанавливаем hibernate.hbm2ddl.auto=create-drop
, чтобы сбрасывать и создавать чистую базу данных каждый раз при разворачивании, таким образом обеспечивая известное состояние нашей базы данных.
В теории вы можете установить hibernate.hbm2ddl.auto=update
, чтобы обновлять вашу базу данных с изменениями в модели, но я бы не стал доверять этому на продакшн базе данных. Ранее в документации говорилось, что это было экспериментально, по крайней мере; я не знаю текущего статуса.
Поэтому для нашей продакшн базы данных не устанавливайте hibernate.hbm2ddl.auto
- по умолчанию это означает отсутствие изменений в базе данных. Вместо этого мы вручную создаем SQL DDL-скрипт обновления, который применяет изменения от одной версии к следующей.
Хотя это довольно старая тема, я провел небольшое исследование по этому вопросу и решил поделиться своими находками.
hibernate.hbm2ddl.auto
Согласно документации, это свойство может иметь четыре допустимых значения:
create | update | validate | create-drop
Вот пояснение поведения, которое соответствует этим значениям:
- create :- создаёт схему, при этом все данные, которые были в схеме (если таковые имеются), будут потеряны.
- update :- обновляет схему с использованием заданных значений.
- validate :- проверяет схему. В базу данных никаких изменений не вносит.
- create-drop :- создаёт схему, при этом уничтожая все ранее существующие данные (если таковые имеются). Также удаляет схему базы данных при закрытии SessionFactory.
Вот некоторые важные моменты, которые стоит отметить:
В случае значения update, если схема отсутствует в базе данных, она будет создана.
В случае значения validate, если схема не существует в базе данных, она не будет создана. Вместо этого будет выброшено исключение:
Table not found:<имя таблицы>
.В случае значения create-drop, схема не удаляется при закрытии сессии. Она удаляется только при закрытии SessionFactory.
Если я задам любое другое значение для этого свойства (например, abc, вместо указанных выше четырёх значений) или оставлю его пустым, будет наблюдаться следующее поведение:
Если схема отсутствует в базе данных: она будет создана.
Если схема присутствует в базе данных: схема будет обновлена.
hibernate.hbm2ddl.auto
автоматически выполняет валидацию и экспорт DDL в схему при создании sessionFactory
.
По умолчанию это свойство не производит никаких операций создания или изменения на базе данных. Если пользователь устанавливает одно из следующих значений, то производятся автоматические изменения схемы DDL:
create - создаёт новую схему:
<entry key="hibernate.hbm2ddl.auto" value="create">
update - обновляет существующую схему:
<entry key="hibernate.hbm2ddl.auto" value="update">
validate - проверяет существующую схему на соответствие:
<entry key="hibernate.hbm2ddl.auto" value="validate">
create-drop - создаёт схему при старте сессии и удаляет её при завершении:
<entry key="hibernate.hbm2ddl.auto" value="create-drop">
Не забудьте выбрать значение, которое соответствует вашим требованиям к управлению схемой базы данных.
Если вы не хотите использовать строки в своем приложении и ищете предопределенные константы, обратите внимание на класс org.hibernate.cfg.AvailableSettings
, который входит в пакет Hibernate. В этом классе вы найдете константы для всех возможных настроек. Например, в вашем случае:
/**
* Автоэкспорт / обновление схемы с использованием инструмента hbm2ddl. Допустимые значения: <tt>update</tt>,
* <tt>create</tt>, <tt>create-drop</tt> и <tt>validate</tt>.
*/
String HBM2DDL_AUTO = "hibernate.hbm2ddl.auto";
Это позволит вам избегать магических строк и повысит читабельность вашего кода.
Вот перевод ваших описаний в стиле ответа на StackOverflow:
validate
: Этот режим просто проверяет схему на соответствие, но никаких изменений в базе данных не происходит. Это полезно, если вы хотите убедиться, что текущая схема соответствует вашему коду, не затрагивая данные.update
: Данный режим обновляет существующую схему в базе данных в соответствии с текущими запросами, которые вы выполняете. Это позволяет вносить изменения без потери уже существующих данных.create
: В этом режиме схема базы данных создается заново каждый раз, что приводит к удалению всех предыдущих данных. Это хороший вариант для тестирования, когда вам нужно начать с чистого листа.create-drop
: Этот режим создает схему при запуске приложения и удаляет её, когда приложение останавливается или когда сессия SessionFactory закрывается явно. Это также удобно для тестирования, так как автоматически управляет жизненным циклом схемы.
Надеюсь, это помогло прояснить различия между этими режимами! Если есть дополнительные вопросы, смело задавайте.
Как исправить ошибку Hibernate "объект ссылается на несохраненный временный экземпляр - сохраните временный экземпляр перед сбросом"
Как работают сервлеты? Инстанцирование, сессии, общие переменные и многопоточность
Какова разница между JDK и JRE?
Java 8: Преобразование List<V> в Map<K, V>
Что такое PECS (Producer Extends Consumer Super)?