web-dev-qa-db-ja.com

Hibernate hbm2ddl.auto設定に設定可能な値は何ですか?

私は本当に更新、エクスポート、そしてhibernate.hbm2ddl.autoに与えることができる値についてもっと知りたいです。
アップデートを使用するタイミングと使用しないタイミングを知っておく必要がありますか?そして代替手段は何ですか?

これらはDB上で起こり得る変更です:

  • 新しいテーブル
  • 古いテーブルの新しい列
  • 列を削除しました
  • 列のデータ型が変更された
  • 列の型がその属性を変更した
  • 削除されたテーブル
  • 列の値が変更された

それぞれの場合において、最良の解決策は何ですか?

993
Suzan

コミュニティのドキュメントから

hibernate.hbm2ddl.auto SessionFactoryが作成されたときに、スキーマDDLを自動的に検証またはデータベースにエクスポートします。 create-dropを使用すると、SessionFactoryが明示的に閉じられたときにデータベーススキーマが削除されます。

例えば検証更新する作成する作成ドロップ

だから可能なオプションのリストは、

  • validate :スキーマを検証し、データベースに変更を加えません。
  • update :スキーマを更新します。
  • create :以前のデータを破棄してスキーマを作成します。
  • create-drop :SessionFactoryが明示的に閉じられたとき、通常はアプリケーションが停止されたときにスキーマを削除します。

これらのオプションは開発者向けのツールであり、本番レベルのデータベースを容易にすることを目的としていないようです。次の質問を見てください。 休止状態:hbm2ddl.auto =製品版を更新しますか?

997
James McMahon

それを完全に無効にするための "none"という文書化されていない値もあります。

185
Michiel Verkaik

設定プロパティはhibernate.hbm2ddl.autoと呼ばれます

開発環境では、デプロイするたびにクリーンなデータベースを削除および作成するようにhibernate.hbm2ddl.auto=create-dropを設定して、データベースが既知の状態になるようにします。

理論的には、モデルへの変更でデータベースを更新するようにhibernate.hbm2ddl.auto=updateを設定できますが、本番データベースではそれを信頼しません。ドキュメントの以前のバージョンは、これは少なくとも実験的なものであると述べました。現状はわかりません。

したがって、本番データベースではhibernate.hbm2ddl.autoを設定しないでください - デフォルトではデータベースは変更されません。代わりに、あるバージョンから次のバージョンへの変更を適用するSQL DDL更新スクリプトを手動で作成します。

149
Peter Hilton

データベースの更新には liquibase を使用します。 Hibernateのスキーマ更新機能は本当に唯一のo.kです。彼らが新機能を開発している間、開発者のために。実稼働環境では、dbのアップグレードはより慎重に処理する必要があります。

51
Pat

それはかなり古い投稿ですが、私はトピックに関するいくつかの研究をしたようにそれを共有することを考えました。

hibernate.hbm2ddl.auto

ドキュメントによれば、4つの有効な値を持つことができます。

作成|更新する検証create-drop

以下は、これらの値によって示される動作の説明です。

  • create : - スキーマを作成します。以前に存在していたスキーマ内のデータは失われます。
  • update: - 与えられた値でスキーマを更新します。
  • validate: - スキーマを検証します。 DBに変更はありません。
  • create-drop: - 以前に存在していたデータを破壊してスキーマを作成します(存在する場合)。 SessionFactoryが閉じられると、データベーススキーマも削除されます。

注目に値する重要な点は次のとおりです。

  • update の場合、schemaがDBに存在しない場合は、schemaが作成されます。
  • validate の場合、schemaがDBに存在しなければ作成されません。代わりに、それはエラーをスローします: - Table not found:<table name>
  • create-drop の場合、セッション終了時にスキーマは削除されません。 SessionFactoryを閉じるときにのみドロップします。
  • もし私がこのプロパティに何か値を与えた場合(上記の4つの値の代わりにabcと言う)、またはそれは単に空白のままにされます。次のような動作が見られます。

    - スキーマがDBに存在しない場合: - スキーマを作成します。

    - スキーマがDBに存在する場合: - update スキーマ。

37
amit

sessionFactoryが作成されると、hibernate.hbm2ddl.autoは自動的にDDLを検証してスキーマにエクスポートします。

デフォルトでは、DBに対して自動的に作成または変更を実行することはありません。ユーザーが以下のいずれかの値を設定すると、DDLスキーマの変更が自動的に行われます。

  • 作成 - スキーマの作成を行う

    <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">
    
25
Vinod Kumawat

まず、hbm2ddl設定プロパティに設定可能な値は次のとおりです。

  • none - アクションは実行されません。スキーマは生成されません。
  • create-only - データベーススキーマが生成されます。
  • drop - データベーススキーマは後で削除され作成されます。
  • create - データベーススキーマは後で削除され作成されます。
  • create-drop - データベーススキーマは後で削除され作成されます。 SessionFactoryを閉じると、データベーススキーマは削除されます。
  • validate - データベーススキーマはエンティティマッピングを使用して検証されます。
  • update - データベーススキーマは、既存のデータベーススキーマとエンティティマッピングを比較して更新されます。

私は ブログ記事 を最も一般的なHibernate DDL生成戦略に捧げました。

  1. hibernate.hbm2ddl.auto="update"は便利ですが、関数の追加やカスタムスクリプトの実行を計画している場合は柔軟性が劣ります。
  2. 最も柔軟なアプローチFlyway を使うことです。

ただし、Flywayを使用しても、hbm2ddlを使用して初期移行スクリプトを生成することはできます。 この記事 では、JPA Entity ModelとjOOQ Table Modelを組み合わせる方法を見ることができます。

23
Vlad Mihalcea

アプリケーションでStringsを使用したくなく、事前定義された定数を探しているのであれば、Hibernate JARに含まれるorg.hibernate.cfg.AvailableSettingsクラスを見てください。すべての可能な設定の定数が見つかります。例えばあなたの場合:

/**
 * 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";
16
Stefan Haberl

私はあなたがに集中する必要があると思います

SchemaExport Class 

このクラスはあなたの設定を動的にするので、それはあなたがあなたが一番良いスイートを選ぶことを可能にします...

チェックアウト [SchemaExport]

7
Vishal Sharma
  • validate:スキーマを検証します。データベースは変更されません。
  • update:現在の実行クエリでスキーマを更新します。
  • create:毎回新しいスキーマを作成し、以前のデータを破壊します。
  • create-drop:アプリケーションが停止したとき、またはSessionFactoryが明示的に閉じられたときにスキーマを削除します。
5
vishal thakur

validate:スキーマを検証し、DBに変更を加えません。
マッピングファイルに新しい列を追加して挿入操作を実行すると、既存のスキーマは挿入しようとしているオブジェクトと異なるため、 "XYZ列がありません"という例外がスローされます。新しい列を手動で追加してテーブルを変更してからInsert操作を実行すると、新しい列と共にすべての列が確実にテーブルに挿入されます。変更を加えないこと/既存のスキーマ/テーブルを変更することを意味します。

update:操作を実行するとデータベース内の既存のテーブルを変更します。 hbm2ddlのこのオプションで列を追加または削除できます。しかし、 'NOT NULL'である新しい列を追加しようとしているのであれば、その特定の列をDBに追加することは無視されます。既存のテーブルに「NOT NULL」列を追加する場合は、テーブルは空でなければならないためです。

4
Arun Raaj

5.0 以降、これらの値は専用のEnumで見つけることができます。 org.hibernate.boot.SchemaAutoTooling (5.2以降の値NONEで拡張)。

さらに良いことには、 5.1 以降では、 org.hibernate.tool.schema.ActionEnumを使用してJPA 2と "従来の" Hibernate DDLアクションを組み合わせることもできます。

しかし 、これではまだDataSourceをプログラム的に設定することはできません。これを org.hibernate.cfg.AvailableSettings#HBM2DDL_AUTO と組み合わせて使用​​した方がよいでしょうが、現在のコードではString値が必要です( SessionFactoryBuilderImpl から抜粋)。

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

…と org.hibernate.boot.SchemaAutoTooling および org.hibernate.tool.schema.Action の内部enum値は一般に公開されていません。

以下では、.name().toLowerCase()のおかげでgambitを使用するサンプルのDataSource設定(私のSpring Bootアプリケーションの一つで使用されている)がダッシュなしの値でのみ動作する(例えば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();
}
3
PomCompot