Я действительно хочу узнать больше об обновлении, экспорте и значениях, которые могут быть присвоены hibernate.hbm2ddl.auto
Мне нужно знать, когда использовать обновление, а когда нет? И какова альтернатива?
Это изменения, которые могут произойти по БД:
В каждом случае лучшее решение?
hibernate.hbm2ddl.auto Автоматически проверяет или экспортирует DDL схемы в базу данных при создании SessionFactory. С помощью create-drop схема базы данных будет удалена, если SessionFactory будет закрыта явно.
например. Проверить | обновление | создать | create-drop
Итак, список возможных вариантов:
Эти параметры, по-видимому, предназначены для разработчиков, а не для облегчения создания баз данных уровня производительности, возможно, вы захотите рассмотреть следующий вопрос; Hibernate: hbm2ddl.auto = обновление в производстве?
Также недокументированное значение "none" полностью отключает его.
Свойство конфигурации называется hibernate.hbm2ddl.auto
В нашей среде разработки мы устанавливаем hibernate.hbm2ddl.auto=create-drop
для удаления и создания чистой базы данных при каждом развертывании, чтобы наша база данных находилась в известном состоянии.
В теории вы можете установить hibernate.hbm2ddl.auto=update
для обновления базы данных с изменениями к вашей модели, но я бы не стал доверять этому в производственной базе данных. В более ранней версии документации говорилось, что это было экспериментально, по крайней мере; Я не знаю текущий статус.
Поэтому для нашей производственной базы данных не устанавливайте hibernate.hbm2ddl.auto
- по умолчанию не нужно изменять базу данных. Вместо этого мы вручную создаем обновление SQL DDL script, которое применяет изменения от одной версии к следующей.
Я бы использовал liquibase для обновления вашего db. Функция обновления схемы спящего режима действительно только o.k. для разработчика, пока они разрабатывают новые функции. В производственной ситуации обновление db необходимо обрабатывать более тщательно.
Хотя это довольно старая должность, но, как я сделал некоторые исследования по этой теме, подумал о том, чтобы поделиться ею.
hibernate.hbm2ddl.auto
В соответствии с документацией он может иметь четыре допустимых значения:
создать | обновление | Проверить | создать падение
Ниже приводится объяснение поведения, показанного этими значениями:
Ниже перечислены важные моменты:
Table not found:<table name>
Если я даю какое-либо значение этому свойству (скажем, abc, а не выше четырех значений, рассмотренных выше), либо он просто оставлен пустым. Он показывает следующее поведение:
-Если схема отсутствует в БД: - она создает схему
-Если схема присутствует в БД: - Обновить схему.
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">
Я посвятил пост в блоге для наиболее распространенных стратегий поколения Hibernate DDL:
hibernate.hbm2ddl.auto="update"
удобно, но менее гибко, если вы планируете добавлять функции или выполнять некоторые пользовательские сценарии.Однако, даже если вы используете Flyway, вы все равно можете сгенерировать начальный сценарий миграции с помощью hbm2ddl. В этой статье вы можете увидеть, как вы можете объединить модель сущности JPA с моделью таблицы jOOQ.
Если вы не хотите использовать 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";
Думаю, вам стоит сосредоточиться на
SchemaExport Class
этот класс делает вашу конфигурацию динамической Таким образом, он позволяет вам выбирать любые сюиты, которые вам нравятся...
Оформить заказ [SchemaExport]
validate
: он проверяет схему и не вносит изменений в БД.
Предположим, вы добавили новый столбец в файл сопоставления и выполнили операцию вставки, он будет генерировать исключение "без столбца XYZ", потому что существующая схема отличается от объекта, который вы собираетесь вставлять. Если вы измените таблицу, добавив этот новый столбец вручную, затем выполните операцию Insert, то она обязательно введет все столбцы вместе с новым столбцом в таблицу.
Это означает, что он не вносит никаких изменений/изменений в существующую схему/таблицу.
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 и "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();
}
validate: проверить схему, не меняться, происходит с базой данных. update: обновить схему с запросом на выполнение в настоящий момент. create: каждый раз создает новую схему и уничтожает предыдущие данные. create-drop: отказаться от схемы, когда приложение остановлено или SessionFactory закрыто явно.
В теории вы можете установить hibernate.hbm2ddl.auto = update, чтобы обновить вашу базу данных с изменениями к вашей модели, но я не стал бы доверять этому в производственной базе данных. В более ранней версии документации говорилось, что это было экспериментально, по крайней мере; Я не знаю текущий статус.
Поэтому для нашей производственной базы данных не устанавливайте hibernate.hbm2ddl.auto - по умолчанию не нужно изменять базу данных. Вместо этого мы вручную создаем обновление SQL DDL script, которое применяет изменения от одной версии к следующей.