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

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

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

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

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

Ответы [ 13 ]

4 голосов
/ 15 октября 2017

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

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

3 голосов
/ 11 августа 2016

Начиная с 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();
}
0 голосов
/ 14 апреля 2016

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

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

...