What are the possible values of the #Hibernate hbm2ddl.auto configuration and what do they do
Я действительно хочу узнать больше об обновлении, экспорте и значениях, которые могут быть даны hibernate.hbm2ddl.auto
Мне нужно знать, когда использовать обновление, а когда нет? И какова альтернатива?
Это изменения, которые могут произойти в БД:
- новые столы
- новые столбцы в старых таблицах
- столбцы удалены
- тип данных столбца изменен
- тип столбца изменил свои атрибуты
- столы упали
- значения столбца изменены
В каждом случае, что является лучшим решением?
15 ответов
hibernate.hbm2ddl.auto Автоматически проверяет или экспортирует DDL схемы в базу данных при создании SessionFactory. С помощью create-drop схема базы данных будет удалена, когда SessionFactory будет закрыт явно.
например проверить | обновление | создать | создание-падение
Итак, список возможных вариантов:
- validate: проверяет схему, не вносит изменений в базу данных.
- обновить: обновить схему.
- create: создает схему, уничтожая предыдущие данные.
- create-drop: удалить схему, когда SessionFactory закрывается явно, обычно, когда приложение остановлено.
Эти параметры, похоже, предназначены для разработчиков, а не для облегчения работы с базами данных производственного уровня. Возможно, вы захотите взглянуть на следующий вопрос; Hibernate: hbm2ddl.auto = обновление в производстве?
Также есть недокументированное значение "none", чтобы полностью отключить его.
Свойство конфигурации называется hibernate.hbm2ddl.auto
В нашей среде разработки мы устанавливаем hibernate.hbm2ddl.auto=create-drop
удалять и создавать чистую базу данных при каждом развертывании, чтобы наша база данных находилась в известном состоянии.
Теоретически вы можете установить hibernate.hbm2ddl.auto=update
обновить вашу базу данных с изменениями в вашей модели, но я бы не стал доверять этому в производственной базе данных. В более ранней версии документации говорилось, что это, по крайней мере, экспериментально; Я не знаю текущий статус.
Поэтому для нашей производственной базы данных не устанавливайте hibernate.hbm2ddl.auto
- по умолчанию не делается никаких изменений в базе данных. Вместо этого мы вручную создаем сценарий обновления SQL DDL, который применяет изменения от одной версии к другой.
Я посвятил пост в блоге наиболее распространенным стратегиям создания Hibernate DDL:
-
hibernate.hbm2ddl.auto="update"
это удобно, но менее гибко, если вы планируете добавить функции или выполнить некоторые пользовательские сценарии. - Наиболее гибкий подход заключается в использовании Flyway.
Однако, даже если вы используете Flyway, вы все равно можете сгенерировать начальный сценарий миграции, используя hbm2ddl. В этой статье вы увидите, как можно объединить модель сущности JPA с моделью таблиц jOOQ.
Я бы использовал liquibase для обновления вашей базы данных. Функция обновления схемы hibernate действительно подходит только для разработчиков, когда они разрабатывают новые функции. В производственной ситуации с обновлением БД нужно обращаться более осторожно.
Хотя это довольно старый пост, но, поскольку я провел небольшое исследование по этой теме, я решил поделиться им.
hibernate.hbm2ddl.auto
Согласно документации он может иметь четыре допустимых значения:
создать | обновление | проверить | создание-падение
Ниже приведено объяснение поведения, показанного этими значениями:
- создать:- создать схему, данные, ранее присутствовавшие (если они есть) в схеме, будут потеряны
- update:- обновить схему с заданными значениями.
- проверить:- проверить схему. Это не меняет БД.
- create-drop:- создать схему с уничтожением ранее имеющихся данных (если они есть). Он также удаляет схему базы данных, когда SessionFactory закрыт.
Ниже приведены важные моменты, на которые стоит обратить внимание:
- В случае обновления, если схема отсутствует в БД, тогда схема создается.
- В случае проверки, если схема не существует в БД, она не создается. Вместо этого он выдаст ошибку:
Table not found:<table name>
- В случае create-drop схема не удаляется при закрытии сеанса. Он сбрасывается только при закрытии SessionFactory.
В случае, если я даю какое-либо значение этому свойству (скажем, abc вместо четырех значений, описанных выше) или оно просто остается пустым. Это показывает следующее поведение:
-Если схема отсутствует в БД:- Создает схему
-Если схема присутствует в БД:- обновите схему.
hibernate.hbm2ddl.auto
автоматически проверяет и экспортирует DDL в схему при создании sessionFactory.
По умолчанию он не выполняет никакого создания или изменения автоматически в БД. Если пользователь устанавливает одно из приведенных ниже значений, он выполняет автоматическую смену схемы DDL.
создать - сделать создание схемы
<entry key="hibernate.hbm2ddl.auto" value="create">
обновить - обновить существующую схему
<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 JAR, где вы найдете константу для всех возможных настроек. В вашем случае, например:
/**
* Auto export/update schema using hbm2ddl tool. Valid values are <tt>update</tt>,
* <tt>create</tt>, <tt>create-drop</tt> and <tt>validate</tt>.
*/
String HBM2DDL_AUTO = "hibernate.hbm2ddl.auto";
validate: проверка схемы, изменения не происходит с базой данных. update: обновить схему текущим выполненным запросом. create: каждый раз создает новую схему и уничтожает предыдущие данные. create-drop: удалить схему, когда приложение остановлено или SessionFactory закрыто явно.
Я думаю, что вы должны сосредоточиться на
SchemaExport Class
этот класс делает вашу конфигурацию динамичной, так что он позволяет вам выбирать то, что вам больше подходит...
Оформить заказ [SchemaExport]
validate
: Проверяет схему и не вносит изменений в базу данных.
Предположим, что вы добавили новый столбец в файл сопоставления и выполнили операцию вставки, он выдаст исключение "отсутствует столбец XYZ", поскольку существующая схема отличается от объекта, который вы собираетесь вставить. Если вы измените таблицу, добавив этот новый столбец вручную, затем выполните операцию вставки, то она обязательно вставит все столбцы вместе с новым столбцом в таблицу. Означает, что он не вносит никаких изменений / изменяет существующую схему / таблицу.
update
: изменяет существующую таблицу в базе данных при выполнении операции. Вы можете добавлять или удалять столбцы с помощью этой опции hbm2ddl. Но если вы собираетесь добавить новый столбец "NOT NULL", он будет игнорировать добавление этого конкретного столбца в БД. Потому что таблица должна быть пустой, если вы хотите добавить столбец NOT 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
):
this.schemaAutoTooling = SchemaAutoTooling.interpret( (String) configurationSettings.get( AvailableSettings.HBM2DDL_AUTO ) );
… И внутренний enum
значения обоих org.hibernate.boot.SchemaAutoTooling
а также org.hibernate.tool.schema.Action
не выставляются публично.
Ниже приводится пример программного DataSource
Конфигурация (используется в одном из моих приложений Spring Boot), которые используют гамбит благодаря .name().toLowerCase()
но он работает только со значениями без тире (не create-drop
например):
@Bean(name = ENTITY_MANAGER_NAME)
public LocalContainerEntityManagerFactoryBean internalEntityManagerFactory(
EntityManagerFactoryBuilder builder,
@Qualifier(DATA_SOURCE_NAME) DataSource internalDataSource) {
Map<String, Object> properties = new HashMap<>();
properties.put(AvailableSettings.HBM2DDL_AUTO, SchemaAutoTooling.CREATE.name().toLowerCase());
properties.put(AvailableSettings.DIALECT, H2Dialect.class.getName());
return builder
.dataSource(internalDataSource)
.packages(JpaModelsScanEntry.class, Jsr310JpaConverters.class)
.persistenceUnit(PERSISTENCE_UNIT_NAME)
.properties(properties)
.build();
}
Кому ищет значение по умолчанию...
Это написано в исходном коде Spring-boot версии 2.0.5 и 1.1.0 в JpaProperties:
/**
* DDL mode. This is actually a shortcut for the "hibernate.hbm2ddl.auto"
* property. Defaults to "create-drop" when using an embedded database and no
* schema manager was detected. Otherwise, defaults to "none".
*/
private String ddlAuto;
Со всем вышесказанным... Обратите внимание, что это свойство называется
dll.auto
и должен управлять только операциями dll (создание/удаление схемы/таблицы), я с удивлением обнаружил, что это также связано с dml: только позволит вставлять данные, что является операцией dml.
Поймал это при попытке заполнить данные в базе данных в памяти; Только
update
работает.
Теоретически вы можете установить hibernate.hbm2ddl.auto=update, чтобы обновить вашу базу данных с изменениями в вашей модели, но я бы не стал доверять этому в рабочей базе данных. В более ранней версии документации говорилось, что это, по крайней мере, экспериментально; Я не знаю текущий статус.
Поэтому для нашей производственной базы данных не устанавливайте hibernate.hbm2ddl.auto - по умолчанию не производится никаких изменений в базе данных. Вместо этого мы вручную создаем сценарий обновления SQL DDL, который применяет изменения от одной версии к другой.