Каковы возможные значения конфигурации Hibernate hbm2ddl.auto и что они делают

Я действительно хочу узнать больше об обновлении, экспорте и значениях, которые могут быть присвоены hibernate.hbm2ddl.auto
Мне нужно знать, когда использовать обновление, а когда нет? И какова альтернатива?

Это изменения, которые могут произойти над DB:

  • новые таблицы
  • новые столбцы в старых таблицах
  • удалённые столбцы
  • тип данных столбца изменен
  • тип столбца изменил свои атрибуты
  • таблицы удалены
  • значения столбца изменены

В каждом случае какое решение является наилучшим?

Из документации сообщества:

hibernate.hbm2ddl.auto Автоматически проверяет или экспортирует DDL схемы в базу данных при создании SessionFactory. При использовании create-drop схема базы данных будет удалена при явном закрытии SessionFactory.

например, validate | update | create | create-drop

Итак, список возможных вариантов таков,

  • validate: проверить схему, не вносит изменений в базу данных.
  • update: обновить схему.
  • create: создает схему, уничтожая предыдущие данные.
  • create-drop: уничтожить схему при явном закрытии SessionFactory, обычно при остановке приложения.

Эти опции, похоже, предназначены для разработчиков, а не для облегчения работы с базами данных производственного уровня, возможно, вам стоит взглянуть на следующий вопрос; [Hibernate: hbm2ddl.auto=update in production?

Комментарии (13)

Есть также недокументированная ценность «нет», чтобы полностью отключить его.

Комментарии (7)

Свойство конфигурации называется hibernate.hbm2ddl.auto.

В нашей среде разработки мы установили hibernate.hbm2ddl.auto=create-drop, чтобы при каждом развертывании сбрасывать и создавать чистую базу данных, чтобы наша база данных находилась в известном состоянии.

Теоретически, вы можете установить hibernate.hbm2ddl.auto=update для обновления базы данных с изменениями в модели, но я бы не стал доверять этому на производственной базе данных. В ранней версии документации говорилось, что это, по крайней мере, экспериментально; я не знаю текущего статуса.

Поэтому для нашей производственной базы данных не устанавливайте hibernate.hbm2ddl.auto - по умолчанию она не вносит изменений в базу данных. Вместо этого мы вручную создаем сценарий обновления SQL DDL, который применяет изменения от одной версии к другой.

Комментарии (3)

Я бы использовал liquibase для обновления вашей базы данных. hibernate' функция обновления схемы действительно подходит только для разработчиков, пока они разрабатывают новые функции. В производственной ситуации обновление базы данных должно выполняться более тщательно.

Комментарии (1)

Хотя это довольно старый пост, но, поскольку я провел некоторое исследование по этой теме, подумал поделиться им.

hibernate.hbm2ddl.auto

Согласно документации, она может иметь четыре допустимых значения: < br / >

создать | обновить | проверить | создать-капать

Ниже приводится объяснение поведения, показанного этим значением:

    • create *: - создать схему, данные, ранее присутствовавшие (если есть) в схеме, утеряны
  • update: - обновить схему с заданными значениями.
  • проверить: - проверить схему. Это не делает никаких изменений в БД .
  • create-drop: - создать схему, уничтожив ранее представленные данные (если есть). Он также отбрасывает схему базы данных, когда SessionFactory закрыт.

Ниже приведены важные моменты, на которые стоит обратить внимание:

  • В случае обновления , если схема отсутствует в БД, создается схема.

  • В случае подтверждения , если схема не существует в БД, она не создается. Вместо этого он выдаст ошибку: - Таблица не найдена: < имя таблицы >

  • В случае create-drop схема не отбрасывается при закрытии сеанса. Он падает только при закрытии SessionFactory.

  • В случае, если я придаю какое-либо значение этому свойству (скажем, abc, вместо четырех значений, указанных выше), или оно просто остается пустым. Это показывает следующее поведение:

    -Если схемы нет в БД :- Она создает схему

    -Если схема присутствует в БД: - обновление схемы.

Комментарии (3)

Во-первых, возможные значения для свойства конфигурации hbm2ddl следующие:

  • n - Никаких действий не выполняется. Схема не будет сгенерирована.
  • create-only - Будет создана схема базы данных.
  • drop - Схема базы данных будет удалена и создана впоследствии.
  • create - Схема базы данных будет удалена и создана впоследствии.
  • create-drop - Схема базы данных будет удалена и создана впоследствии. После закрытия SessionFactory схема базы данных будет удалена.
  • validate - Схема базы данных будет проверена с использованием сопоставлений сущностей.
  • update - Схема базы данных будет обновлена путем сравнения существующей схемы базы данных с сопоставлениями сущностей.

Я посвятил пост блога для наиболее распространенных стратегий генерации спящего DDL :

  1. Hibernate.hbm2ddl.auto = "update"удобно, но менее гибко, если вы планируете добавлять функции или выполнять некоторые пользовательские сценарии.
    • Самый гибкий подход * - использовать Flyway.

Однако, даже если вы используете Flyway, вы все равно можете сгенерировать начальный скрипт миграции, используя hbm2ddl. В этой статье вы можете увидеть, как вы можете комбинировать модель сущности JPA с моделью таблицы jOOQ.

Комментарии (0)

hibernate.hbm2ddl.auto автоматически проверяет и экспортирует DDL в схему при создании sessionFactory.

По умолчанию он не выполняет никаких действий по созданию или изменению автоматически в БД. Если пользователь устанавливает одно из следующих значений, он автоматически изменяет схему DDL.

  • создать - делать создание схемы

     < entry key = "hibernate.hbm2ddl.auto" value = "create" >
  • обновление - обновление существующей схемы

     < entry key = "hibernate.hbm2ddl.auto" value = "update" >
  • проверить - проверить существующую схему

     < entry key = "hibernate.hbm2ddl.auto" value = "validate" >
  • create-drop - автоматически создавать и отбрасывать схему, когда сеанс начинается и заканчивается

     < entry key = "hibernate.hbm2ddl.auto" value = "create-drop" >
Комментарии (1)

Если вы не хотите использовать Strings в своем приложении и ищете предопределенные константы, взгляните на org.hibernate.cfg.AvailableSettings класс, включенный в Hibernate JAR, где вы найдете константу для всех возможных настроек. ,. В вашем случае, например:

/**
 * Auto export/update schema using hbm2ddl tool. Valid values are update,
 * create, create-drop and validate.
 */
String HBM2DDL_AUTO = "hibernate.hbm2ddl.auto";
Комментарии (2)
  • validate: проверяет схему, никаких изменений в базе данных не происходит.
  • update: обновляет схему текущим запросом выполнения.
  • create: каждый раз создает новую схему и уничтожает предыдущие данные.
  • create-drop: отбрасывает схему, когда приложение остановлено или SessionFactory явно закрыт.
Комментарии (0)

Я думаю, что вы должны сосредоточиться на

SchemaExport Class 

этот класс делает вашу конфигурацию динамичной Таким образом, он позволяет вам выбирать любые наборы, которые вам лучше всего...

Оформить заказ \ [SchemaExport ]

Комментарии (0)

validate: проверяет схему и не вносит изменений в БД Предположим, что вы добавили новый столбец в файл отображения и выполните операцию вставки, он выдаст исключение «отсутствует столбец XYZ», поскольку существующая схема отличается от объекта, который вы собираетесь вставить. Если вы измените таблицу, добавив этот новый столбец вручную, а затем выполните операцию «Вставка», она обязательно вставит все столбцы вместе с новым столбцом в таблицу. Означает, что он не вносит никаких изменений / изменений в существующую схему / таблицу.

update: он изменяет существующую таблицу в базе данных при выполнении операции. Вы можете добавлять или удалять столбцы с помощью этой опции hbm2ddl. Но если вы собираетесь добавить новый столбец «НЕ NULL», он будет игнорировать добавление этого конкретного столбца в DB. Поскольку таблица должна быть пустой, если вы хотите добавить столбец «НЕ NULL» в существующую таблицу.

Комментарии (0)

Начиная с 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 - >

this.schemaAutoTooling = SchemaAutoTooling.interpret( (String) configurationSettings.get( AvailableSettings.HBM2DDL_AUTO ) );

... и внутренние значения enum как org.hibernate.boot.SchemaAutoTooling, так и org.hibernate.tool.schema.Action не публикуются публично.

Ниже приведен пример программной конфигурации DataSource (используется в одном из моих приложений Spring Boot), которые используют gambit благодаря .name () .toLowerCase (), но он работает только со значениями без тире (не create-drop например):

& Лт;!- язык: Java - >

@Bean(name = ENTITY_MANAGER_NAME)
public LocalContainerEntityManagerFactoryBean internalEntityManagerFactory(
        EntityManagerFactoryBuilder builder,
        @Qualifier(DATA_SOURCE_NAME) DataSource internalDataSource) {

    Map 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();
}
Комментарии (0)

Теоретически, вы можете установить hibernate.hbm2ddl.auto = update, чтобы обновить вашу базу данных с изменениями в вашей модели, но я бы не стал доверять этому в производственной базе данных. В более ранней версии документации говорилось, что это было, по крайней мере, экспериментально; Я не знаю текущего статуса.

Поэтому для нашей производственной базы данных не устанавливайте hibernate.hbm2ddl.auto - по умолчанию не вносится никаких изменений в базу данных. Вместо этого мы вручную создаем сценарий обновления SQL DDL, который применяет изменения от одной версии к другой.

Комментарии (0)