Я действительно хочу узнать больше об обновлении, экспорте и значениях, которые могут быть предоставлены. hibernate.hbm2ddl.auto
Мне нужно знать, когда использовать обновление, а когда нет? И какова альтернатива?
Это изменения, которые могут произойти в БД:
- новые столы
- новые столбцы в старых таблицах
- столбцы удалены
- тип данных столбца изменен
- тип столбца изменил свои атрибуты
- столы упали
- значения столбца изменены
В каждом случае, что является лучшим решением?
Также есть недокументированное значение «none», чтобы полностью отключить его.
источник
Свойство конфигурации называется
hibernate.hbm2ddl.auto
В нашей среде разработки мы собираемся
hibernate.hbm2ddl.auto=create-drop
удалять и создавать чистую базу данных при каждом развертывании, чтобы наша база данных находилась в известном состоянии.Теоретически, вы можете настроить
hibernate.hbm2ddl.auto=update
обновление базы данных с учетом изменений в вашей модели, но я бы не стал доверять этому в рабочей базе данных. В более ранней версии документации говорилось, что это было экспериментально, по крайней мере; Я не знаю текущий статус.Поэтому для нашей производственной базы данных не устанавливайте
hibernate.hbm2ddl.auto
- по умолчанию не производится никаких изменений в базе данных. Вместо этого мы вручную создаем сценарий обновления SQL DDL, который применяет изменения от одной версии к другой.источник
Я бы использовал liquibase для обновления вашей базы данных . Функция обновления схемы hibernate действительно подходит только для разработчиков, когда они разрабатывают новые функции. В производственной ситуации с обновлением БД нужно обращаться более осторожно.
источник
Хотя это довольно старый пост, но, поскольку я провел небольшое исследование по этой теме, я решил поделиться им.
hibernate.hbm2ddl.auto
Согласно документации он может иметь четыре допустимых значения:
создать | обновление | проверить | создание-падение
Ниже приведено объяснение поведения, показанного этими значениями:
Ниже приведены важные моменты, на которые стоит обратить внимание:
Table not found:<table name>
В случае, если я даю какое-либо значение этому свойству (скажем, abc вместо четырех значений, описанных выше), или оно просто остается пустым. Это показывает следующее поведение:
-Если схема отсутствует в БД: - Создает схему
-Если схема присутствует в БД: - обновите схему.
источник
Во-первых, возможны следующие значения
hbm2ddl
свойства конфигурации:none
- Никаких действий не выполняется. Схема не будет сгенерирована.create-only
- Схема базы данных будет сгенерирована.drop
- Схема базы данных будет удалена и создана впоследствии.create
- Схема базы данных будет удалена и создана впоследствии.create-drop
- Схема базы данных будет удалена и создана впоследствии. После закрытияSessionFactory
, схема базы данных будет удалена.validate
- Схема базы данных будет проверена с использованием сопоставлений сущностей.update
- Схема базы данных будет обновлена путем сравнения существующей схемы базы данных с сопоставлениями сущностей.Я посвятил пост в блоге наиболее распространенным стратегиям создания Hibernate DDL :
hibernate.hbm2ddl.auto="update"
удобно, но менее гибко, если вы планируете добавлять функции или выполнять некоторые пользовательские сценарии.Однако, даже если вы используете Flyway, вы все равно можете сгенерировать начальный сценарий миграции, используя hbm2ddl. В этой статье вы узнаете, как можно объединить модель сущности JPA с моделью таблиц jOOQ.
источник
hibernate.hbm2ddl.auto
автоматически проверяет и экспортирует DDL в схему при создании sessionFactory.По умолчанию он не выполняет никакого создания или изменения автоматически в БД. Если пользователь устанавливает одно из следующих значений, то это делает изменения схемы DDL автоматически.
создать - сделать создание схемы
обновить - обновить существующую схему
validate - проверить существующую схему
create-drop - создать и удалить схему автоматически, когда сеанс начинается и заканчивается
источник
Если вы не хотите использовать строки в своем приложении и ищете предопределенные константы, взгляните на
org.hibernate.cfg.AvailableSettings
класс, включенный в JAR Hibernate, где вы найдете константу для всех возможных настроек. В вашем случае, например:источник
validate
: проверяет схему, с базой данных никаких изменений не происходит.update
: обновляет схему текущим запросом на выполнение.create
: каждый раз создает новую схему и уничтожает предыдущие данные.create-drop
: удаляет схему, когда приложение остановлено или SessionFactory закрыто явно.источник
Я думаю, что вы должны сосредоточиться на
этот класс делает вашу конфигурацию динамичной, так что он позволяет вам выбирать то, что вам больше подходит ...
Оформить заказ [SchemaExport]
источник
validate
: Проверяет схему и не вносит изменений в базу данных.Предположим, что вы добавили новый столбец в файл сопоставления и выполнили операцию вставки, он выдаст исключение «отсутствует столбец XYZ», поскольку существующая схема отличается от объекта, который вы собираетесь вставить. Если вы измените таблицу, добавив этот новый столбец вручную, затем выполните операцию вставки, тогда она обязательно вставит все столбцы вместе с новым столбцом в таблицу. Означает, что он не вносит никаких изменений / изменяет существующую схему / таблицу.
update
: он изменяет существующую таблицу в базе данных при выполнении операции. Вы можете добавлять или удалять столбцы с помощью этой опции hbm2ddl. Но если вы собираетесь добавить новый столбец «NOT NULL», он будет игнорировать добавление этого конкретного столбца в БД. Потому что таблица должна быть пустой, если вы хотите добавить столбец «NOT NULL» в существующую таблицу.источник
Начиная с 5.0 , теперь вы можете найти эти значения в выделенном
Enum
:org.hibernate.boot.SchemaAutoTooling
(улучшено со значениемNONE
с 5.2).Или даже лучше, начиная с версии 5.1 , вы также можете использовать тот, который сочетает в себе JPA 2 и «устаревшие» действия Hibernate DDL.
org.hibernate.tool.schema.Action
Enum
Но вы еще не можете настроить
DataSource
программно с этим. Было бы лучше использовать это в сочетании с,org.hibernate.cfg.AvailableSettings#HBM2DDL_AUTO
но текущий код ожидаетString
значение (отрывок взят изSessionFactoryBuilderImpl
):... и внутренние
enum
ценности того и другогоorg.hibernate.boot.SchemaAutoTooling
иorg.hibernate.tool.schema.Action
не раскрываются публично.Ниже приведен пример программной
DataSource
конфигурации (используемой в моих приложениях Spring Boot), в которой используется гамбит,.name().toLowerCase()
но он работает только со значениями без черты (неcreate-drop
для примера):источник
Кому ищет значение по умолчанию ...
Это написано в исходном коде версии 2.0.5 Spring-Boot и 1.1.0 в JpaProperties:
источник