Каковы возможные значения конфигурации Hibernate hbm2ddl.auto и что они делают
Я действительно хочу узнать больше об обновлении, экспорте и значениях, которые могут быть присвоены hibernate.hbm2ddl.auto
Мне нужно знать, когда использовать обновление, а когда нет? И какова альтернатива?
Это изменения, которые могут произойти по БД:
- новые таблицы
- новые столбцы в старых таблицах
- удалены столбцы
- тип данных столбца изменен
- тип столбца изменил его атрибуты
- таблицы упали
- значения столбца изменены
В каждом случае лучшее решение?
Ответы
Ответ 1
Из документации сообщества:
hibernate.hbm2ddl.auto Автоматически проверяет или экспортирует DDL схемы в базу данных при создании SessionFactory. С помощью create-drop схема базы данных будет удалена, если SessionFactory будет закрыта явно.
например. Проверить | обновление | создать | create-drop
Итак, список возможных вариантов:
- validate: проверить схему, не вносить изменения в базу данных.
- update: обновить схему.
- create: создает схему, уничтожая предыдущие данные.
- create-drop: отказаться от схемы, когда SessionFactory закрывается явно, как правило, когда приложение остановлено.
Эти параметры, по-видимому, предназначены для разработчиков, а не для облегчения создания баз данных уровня производительности, возможно, вы захотите рассмотреть следующий вопрос; Hibernate: hbm2ddl.auto = обновление в производстве?
Ответ 2
Также недокументированное значение "none" полностью отключает его.
Ответ 3
Свойство конфигурации называется hibernate.hbm2ddl.auto
В нашей среде разработки мы устанавливаем hibernate.hbm2ddl.auto=create-drop
для удаления и создания чистой базы данных при каждом развертывании, чтобы наша база данных находилась в известном состоянии.
В теории вы можете установить hibernate.hbm2ddl.auto=update
для обновления базы данных с изменениями к вашей модели, но я бы не стал доверять этому в производственной базе данных. В более ранней версии документации говорилось, что это было экспериментально, по крайней мере; Я не знаю текущий статус.
Поэтому для нашей производственной базы данных не устанавливайте hibernate.hbm2ddl.auto
- по умолчанию не нужно изменять базу данных. Вместо этого мы вручную создаем обновление SQL DDL script, которое применяет изменения от одной версии к следующей.
Ответ 4
Я бы использовал liquibase для обновления вашего db. Функция обновления схемы спящего режима действительно только o.k. для разработчика, пока они разрабатывают новые функции. В производственной ситуации обновление db необходимо обрабатывать более тщательно.
Ответ 5
Хотя это довольно старая должность, но, как я сделал некоторые исследования по этой теме, подумал о том, чтобы поделиться ею.
hibernate.hbm2ddl.auto
В соответствии с документацией он может иметь четыре допустимых значения:
создать | обновление | Проверить | создать падение
Ниже приводится объяснение поведения, показанного этими значениями:
- create: - создать схему, данные, ранее присутствующие (если есть) в схеме потеряны
- update: - обновить схему с указанными значениями.
- validate: - проверить схему. Он не вносит изменений в БД.
- create-drop: создать схему с уничтожением ранее представленных данных (если есть). Он также удаляет схему базы данных, когда SessionFactory закрывается.
Ниже перечислены важные моменты:
- В случае обновления, если схема отсутствует в БД, тогда создается схема.
- В случае проверки, если схема не существует в БД, она не создается. Вместо этого он выдаст ошибку: -
Table not found:<table name>
- В случае create-drop при закрытии сеанса схема не будет удалена. Он падает только при закрытии SessionFactory.
-
Если я даю какое-либо значение этому свойству (скажем, abc, а не выше четырех значений, рассмотренных выше), либо он просто оставлен пустым. Он показывает следующее поведение:
-Если схема отсутствует в БД: - она создает схему
-Если схема присутствует в БД: - Обновить схему.
Ответ 6
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">
Ответ 7
Во-первых, возможные значения для hbm2ddl
конфигурации hbm2ddl
следующие:
-
none
- действие не выполняется. Схема не будет сгенерирована. -
create-only
- будет сгенерирована схема базы данных. -
drop
- схема базы данных будет удалена и создана впоследствии. -
create
- схема базы данных будет удалена и впоследствии создана. -
create-drop
- схема базы данных будет удалена и впоследствии создана. После закрытия SessionFactory
схема базы данных будет удалена. -
validate
- схема базы данных будет проверена с использованием сопоставлений сущностей. -
update
- схема базы данных будет обновлена путем сравнения существующей схемы базы данных с сопоставлениями сущностей.
Я посвятил пост в блоге наиболее распространенным стратегиям создания Hibernate DDL:
-
hibernate.hbm2ddl.auto="update"
удобен, но менее гибок, если вы планируете добавлять функции или выполнять некоторые пользовательские сценарии. - Наиболее гибкий подход заключается в использовании Flyway.
Однако, даже если вы используете Flyway, вы все равно можете сгенерировать начальный сценарий миграции, используя hbm2ddl. В этой статье вы узнаете, как можно объединить модель сущности JPA с моделью таблиц jOOQ.
Ответ 8
Если вы не хотите использовать Strings в своем приложении и ищете предопределенные константы, посмотрите класс org.hibernate.cfg.AvailableSettings
, включенный в JAR Hibernate, где вы найдете константу для всех возможных настроек. Например, в вашем случае:
/**
* 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";
Ответ 9
Думаю, вам стоит сосредоточиться на
SchemaExport Class
этот класс делает вашу конфигурацию динамической
Таким образом, он позволяет вам выбирать любые сюиты, которые вам нравятся...
Оформить заказ [SchemaExport]
Ответ 10
-
validate
: проверяет схему, в базе данных не происходит никаких изменений. -
update
: обновляет схему текущим запросом на выполнение. -
create
: каждый раз создает новую схему и уничтожает предыдущие данные. -
create-drop
: удаляет схему, когда приложение остановлено или SessionFactory закрыто явно.
Ответ 11
validate
: он проверяет схему и не вносит изменений в БД.
Предположим, вы добавили новый столбец в файл сопоставления и выполнили операцию вставки, он будет генерировать исключение "без столбца XYZ", потому что существующая схема отличается от объекта, который вы собираетесь вставлять. Если вы измените таблицу, добавив этот новый столбец вручную, затем выполните операцию Insert, то она обязательно введет все столбцы вместе с новым столбцом в таблицу.
Это означает, что он не вносит никаких изменений/изменений в существующую схему/таблицу.
update
: он изменяет существующую таблицу в базе данных при выполнении операции.
Вы можете добавлять или удалять столбцы с помощью этой опции hbm2ddl.
Но если вы собираетесь добавить новый столбец "NOT NULL", он будет игнорировать добавление этого конкретного столбца в БД. Поскольку таблица должна быть пустой, если вы хотите добавить столбец "NOT NULL" в существующую таблицу.
Ответ 12
Начиная с версии 5.0, вы можете найти эти значения в выделенном Enum
: org.hibernate.boot.SchemaAutoTooling
(расширенный со значением NONE
с 5.2).
Или даже лучше, с 5.1, вы также можете использовать org.hibernate.tool.schema.Action
Enum
, который объединяет JPA 2 и "legacy" 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();
}
Ответ 13
В теории вы можете установить hibernate.hbm2ddl.auto = update, чтобы обновить вашу базу данных с изменениями к вашей модели, но я не стал бы доверять этому в производственной базе данных. В более ранней версии документации говорилось, что это было экспериментально, по крайней мере; Я не знаю текущий статус.
Поэтому для нашей производственной базы данных не устанавливайте hibernate.hbm2ddl.auto - по умолчанию не нужно изменять базу данных. Вместо этого мы вручную создаем обновление SQL DDL script, которое применяет изменения от одной версии к следующей.