Анонимный пользователь
Дополнительно
Каковы возможные значения конфигурации Hibernate hbm2ddl.auto и что они делают
Я действительно хочу узнать больше об обновлении, экспорте и значениях, которые могут быть присвоены hibernate.hbm2ddl.auto
Мне нужно знать, когда использовать обновление, а когда нет? И какова альтернатива?
Это изменения, которые могут произойти над DB:
- новые таблицы
- новые столбцы в старых таблицах
- удалённые столбцы
- тип данных столбца изменен
- тип столбца изменил свои атрибуты
- таблицы удалены
- значения столбца изменены
В каждом случае какое решение является наилучшим?
1037
13
Из документации сообщества:
Итак, список возможных вариантов таков,
Эти опции, похоже, предназначены для разработчиков, а не для облегчения работы с базами данных производственного уровня, возможно, вам стоит взглянуть на следующий вопрос; [Hibernate: hbm2ddl.auto=update in production?
Есть также недокументированная ценность «нет», чтобы полностью отключить его.
Свойство конфигурации называется
hibernate.hbm2ddl.auto
.В нашей среде разработки мы установили
hibernate.hbm2ddl.auto=create-drop
, чтобы при каждом развертывании сбрасывать и создавать чистую базу данных, чтобы наша база данных находилась в известном состоянии.Теоретически, вы можете установить
hibernate.hbm2ddl.auto=update
для обновления базы данных с изменениями в модели, но я бы не стал доверять этому на производственной базе данных. В ранней версии документации говорилось, что это, по крайней мере, экспериментально; я не знаю текущего статуса.Поэтому для нашей производственной базы данных не устанавливайте
hibernate.hbm2ddl.auto
- по умолчанию она не вносит изменений в базу данных. Вместо этого мы вручную создаем сценарий обновления SQL DDL, который применяет изменения от одной версии к другой.Я бы использовал liquibase для обновления вашей базы данных. hibernate' функция обновления схемы действительно подходит только для разработчиков, пока они разрабатывают новые функции. В производственной ситуации обновление базы данных должно выполняться более тщательно.
Хотя это довольно старый пост, но, поскольку я провел некоторое исследование по этой теме, подумал поделиться им.
hibernate.hbm2ddl.auto
Согласно документации, она может иметь четыре допустимых значения: < br / >
создать | обновить | проверить | создать-капать
Ниже приводится объяснение поведения, показанного этим значением:
Ниже приведены важные моменты, на которые стоит обратить внимание:
В случае обновления , если схема отсутствует в БД, создается схема.
В случае подтверждения , если схема не существует в БД, она не создается. Вместо этого он выдаст ошибку: -
Таблица не найдена: < имя таблицы >
В случае create-drop схема не отбрасывается при закрытии сеанса. Он падает только при закрытии SessionFactory.
В случае, если я придаю какое-либо значение этому свойству (скажем, abc, вместо четырех значений, указанных выше), или оно просто остается пустым. Это показывает следующее поведение:
-Если схемы нет в БД :- Она создает схему
-Если схема присутствует в БД: - обновление схемы.
Во-первых, возможные значения для свойства конфигурации
hbm2ddl
следующие:n
- Никаких действий не выполняется. Схема не будет сгенерирована.create-only
- Будет создана схема базы данных.drop
- Схема базы данных будет удалена и создана впоследствии.create
- Схема базы данных будет удалена и создана впоследствии.create-drop
- Схема базы данных будет удалена и создана впоследствии. После закрытияSessionFactory
схема базы данных будет удалена.validate
- Схема базы данных будет проверена с использованием сопоставлений сущностей.update
- Схема базы данных будет обновлена путем сравнения существующей схемы базы данных с сопоставлениями сущностей.Я посвятил пост блога для наиболее распространенных стратегий генерации спящего DDL :
Hibernate.hbm2ddl.auto = "update"
удобно, но менее гибко, если вы планируете добавлять функции или выполнять некоторые пользовательские сценарии.Однако, даже если вы используете Flyway, вы все равно можете сгенерировать начальный скрипт миграции, используя hbm2ddl. В этой статье вы можете увидеть, как вы можете комбинировать модель сущности JPA с моделью таблицы jOOQ.
hibernate.hbm2ddl.auto
автоматически проверяет и экспортирует DDL в схему при создании sessionFactory.По умолчанию он не выполняет никаких действий по созданию или изменению автоматически в БД. Если пользователь устанавливает одно из следующих значений, он автоматически изменяет схему DDL.
создать - делать создание схемы
обновление - обновление существующей схемы
проверить - проверить существующую схему
create-drop - автоматически создавать и отбрасывать схему, когда сеанс начинается и заканчивается
Если вы не хотите использовать Strings в своем приложении и ищете предопределенные константы, взгляните на
org.hibernate.cfg.AvailableSettings
класс, включенный в Hibernate JAR, где вы найдете константу для всех возможных настроек. ,. В вашем случае, например:validate
: проверяет схему, никаких изменений в базе данных не происходит.update
: обновляет схему текущим запросом выполнения.create
: каждый раз создает новую схему и уничтожает предыдущие данные.create-drop
: отбрасывает схему, когда приложение остановлено или SessionFactory явно закрыт.Я думаю, что вы должны сосредоточиться на
этот класс делает вашу конфигурацию динамичной Таким образом, он позволяет вам выбирать любые наборы, которые вам лучше всего...
Оформить заказ \ [SchemaExport ]
validate
: проверяет схему и не вносит изменений в БД Предположим, что вы добавили новый столбец в файл отображения и выполните операцию вставки, он выдаст исключение «отсутствует столбец XYZ», поскольку существующая схема отличается от объекта, который вы собираетесь вставить. Если вы измените таблицу, добавив этот новый столбец вручную, а затем выполните операцию «Вставка», она обязательно вставит все столбцы вместе с новым столбцом в таблицу. Означает, что он не вносит никаких изменений / изменений в существующую схему / таблицу.update
: он изменяет существующую таблицу в базе данных при выполнении операции. Вы можете добавлять или удалять столбцы с помощью этой опции hbm2ddl. Но если вы собираетесь добавить новый столбец «НЕ NULL», он будет игнорировать добавление этого конкретного столбца в DB. Поскольку таблица должна быть пустой, если вы хотите добавить столбец «НЕ NULL» в существующую таблицу.Начиная с 5.0 , теперь вы можете найти эти значения в специальном
Enum
:org.hibernate.boot.SchemaAutoTooling
(улучшено значениемNONE
с 5.2).Или, что еще лучше, с 5.1 , вы также можете использовать
org.hibernate.tool.schema.Action
Enum
, который объединяет действия JPA 2 и «наследие» Hibernate DDL.Но , вы еще не можете настроить
DataSource
программно с этим. Было бы лучше использовать это в сочетании сorg.hibernate.cfg.AvailableSettings # HBM2DDL_AUTO
, но текущий код ожидает значениеString
(выдержка взята из [SessionFactoryBuilderImpl
] [6 ]):& Лт;!- язык: Java - >
... и внутренние значения
enum
какorg.hibernate.boot.SchemaAutoTooling
, так иorg.hibernate.tool.schema.Action
не публикуются публично.Ниже приведен пример программной конфигурации
DataSource
(используется в одном из моих приложений Spring Boot), которые используют gambit благодаря.name () .toLowerCase ()
, но он работает только со значениями без тире (неcreate-drop
например):& Лт;!- язык: Java - >
Теоретически, вы можете установить hibernate.hbm2ddl.auto = update, чтобы обновить вашу базу данных с изменениями в вашей модели, но я бы не стал доверять этому в производственной базе данных. В более ранней версии документации говорилось, что это было, по крайней мере, экспериментально; Я не знаю текущего статуса.
Поэтому для нашей производственной базы данных не устанавливайте hibernate.hbm2ddl.auto - по умолчанию не вносится никаких изменений в базу данных. Вместо этого мы вручную создаем сценарий обновления SQL DDL, который применяет изменения от одной версии к другой.