Каковы возможные значения конфигурации Hibernate hbm2ddl.auto и что они делают - PullRequest
998 голосов
/ 13 января 2009

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

Это изменения, которые могут произойти в БД:

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

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

Ответы [ 13 ]

1001 голосов
/ 06 ноября 2009

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

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

например. проверить | обновление | создать | create-drop

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

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

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

185 голосов
/ 08 июня 2012

Существует также недокументированное значение «none», чтобы полностью отключить его.

150 голосов
/ 13 января 2009

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

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

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

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

51 голосов
/ 23 марта 2009

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

38 голосов
/ 07 августа 2016

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

hibernate.hbm2ddl.auto

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

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

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

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

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

  • В случае обновление , если схема отсутствует в БД, то схема создается.
  • В случае проверить , если схема не существует в БД, она не создается. Вместо этого он выдаст ошибку: - Table not found:<table name>
  • В случае create-drop схема не удаляется при закрытии сеанса. Он сбрасывается только при закрытии SessionFactory.
  • В случае, если я даю какое-либо значение этому свойству (скажем, abc вместо четырех значений, описанных выше) или оно просто остается пустым Это показывает следующее поведение:

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

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

25 голосов
/ 11 мая 2017

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

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

  • create - создание схемы

    <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">
    
23 голосов
/ 15 мая 2014

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

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

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

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

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

16 голосов
/ 10 февраля 2015

Если вы не хотите использовать строки в своем приложении и ищете предопределенные константы, взгляните на класс 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";
7 голосов
/ 21 июня 2012

Думаю, вам стоит сосредоточиться на

SchemaExport Class 

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

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

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