Hibernate hbm2ddl.auto構成の可能な値とは何ですか?


1085

更新、エクスポート、およびhibernate.hbm2ddl.auto
更新を使用するタイミングと使用しないタイミングを知るために必要な値について、もっと知りたいのですが?そして代替は何ですか?

これらは、DBで発生する可能性のある変更です。

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

どちらの場合も、最善の解決策は何ですか?

回答:


1083

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

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

例:検証| 更新| 作成| 作成ドロップ

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

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

これらのオプションは、開発者向けツールであり、本番レベルのデータベースを容易にするためのものではないようです。次の質問をご覧ください。Hibernate:hbm2ddl.auto = update in production?


14
hibernate docuを読んでください...有効な値については、「eg」...他に有効な値はありますか?
Ta Sas

16
「eg」と書いてあると思います。これは単なるコミュニティドキュメントなので、誰かがすべての可能な値に興味がある場合は、Hibernateのjavadocで見つけることができます。(そして、はい、のみ4つのオプションが存在している) docs.jboss.org/hibernate/orm/4.1/javadocs/org/hibernate/cfg/...
szegedi

4
validateはスキーマを検証する、とはどういう意味ですか?
フセインアクタールワヒド 'グーリ'

6
休止状態で何も行わない場合は、 'aardvark'、 'pigeon'、またはその他の単語を使用することもできます。もちろんそれはお勧めしません!
ワード

2
create-dropオプションへの小さな追加。このオプションを使用すると、スキーマ全体が削除されるのではなく、これを実行中にマッピングが使用可能なテーブルが削除されます。スキーマSのデータベースがA、B、Cのテーブルを有しており、Javaコードは、AとBのマッピングを有する場合のみ、次にHibernateは、テーブルCをドロップしないであろう
アディ

194

ドキュメント化されていない「none」の値もあり、完全に無効にできます。


7
Hibernateのスキーマ検証は、完全に有効なスキーマでは失敗することがあるため、これは実際には非常に便利です。
Michael Piefel

私はこのようなことを求めようとしていました。私の意図は、起動時間を短縮することです。
digao_mb 2013年

46
'空の文字列'は 'none'よりも優れています。「なし」を使用すると、警告メッセージが表示されます:org.hibernate.cfg.SettingsFactory-「hibernate.hbm2ddl.auto」の認識されない値:なし
okwap

14
パッチを当てました。明示的に有効な定数として「なし」を追加しました。
サンネ2016年

9
I他のものより"hibernate.hbm2ddl.auto =ポテト"のようなstackoverflow.com/a/15810379/838444
SNEG

161

構成プロパティが呼び出されます hibernate.hbm2ddl.auto

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

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

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


5
実際、ドキュメントに従って、create-dropはデータベーステーブルを作成し、セッションファクトリが明示的に閉じられたときにそれらを削除します。セッションファクトリの作成時にテーブル削除されませ
フランス、2014年

4
いいえ、セッションファクトリの作成時にcreate-dropとcreateの両方がテーブルをドロップし、セッションファクトリが閉じているときにもcreate-dropはテーブルをドロップします。stackoverflow.com/a/6752698/1536382を
Testo Testini

本番環境でhibernate.hbm2ddl.auto = create-dropを作成すると、本番環境でいくつかの接続タイムアウトが発生する可能性がありますか?
METTAIBI 2017

51

私はあなたのdbを更新するためにliquibaseを使用します。hibernateのスキーマ更新機能は、実際には開発者が新しい機能を開発している間のみ問題ありません。本番環境では、dbアップグレードをより注意深く処理する必要があります。


6
本番環境でhbm2ddlを使用すべきでない理由については、stackoverflow.com / questions / 221379 /…を参照してください。
Nathan Voxland 2009年

51

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

hibernate.hbm2ddl.auto

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

作成| 更新| 検証| 作成ドロップ

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

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

以下は、注目に値する重要なポイントです。

  • 以下の場合に更新スキーマがDBに存在しない場合、スキーマが作成されます。
  • 以下の場合に検証スキーマがDBに存在しない場合、それは作成されません。代わりに、エラーがスローされます:-Table not found:<table name>
  • create-dropの場合、セッションを閉じてもスキーマは削除されません。SessionFactoryを閉じるときにのみドロップします。
  • このプロパティに値を指定した場合(たとえば、上記の4つの値の代わりにabcとする)、または空白のままにします。次の動作を示します。

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

    -スキーマがDBに存在する場合:- スキーマを更新します。


「更新」を使用する場合、スキーマが存在しない場合に作成されることは、非常に重要なポイントです。
yuranos

「動作の説明」と「重要なポイント」のステートメントを比較すると、create-dropは矛盾しています。
VNT 2018

2
updateemptyの違いは何ですか?
yashjain12yj

46

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

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

私は最も一般的なHibernate DDL生成戦略についてブログ投稿を捧げました:

  1. hibernate.hbm2ddl.auto="update"あなたが機能を追加したり、いくつかのカスタムスクリプトを実行する予定がある場合に便利が、あまり柔軟性があります。
  2. 最も柔軟なアプローチが使用することですフライウェイを

ただし、Flywayを使用している場合でも、hbm2ddlを使用して初期移行スクリプトを生成できます。で、この記事では、あなたがjOOQ表モデルでJPAエンティティモデルを組み合わせることができますどのように見ることができます。


27

hibernate.hbm2ddl.auto は、sessionFactoryの作成時に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">

2
<entry key = "hibernate.hbm2ddl.auto" value = "none">はどうですか?
VNT 2018

17

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

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

5
なぜ、500以上のハタネズミのストレート回答よりも長い700行以上のソースファイルを参照しているのですか?
Pavel Niedoba、2015

...その質問は意味がありません。なぜ物事があるのですか?どうしてここにいるの?
Specializ

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

「公式」ドキュメント参照とは何ですか?-ただ疑問に思っています...
ダークシューマッハ


4

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

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


3

5.0以降、専用のEnum:でこれらの値を検索できるようになりましたorg.hibernate.boot.SchemaAutoToolingNONE5.2以降の値で拡張)。

あるいは、5.1以降では、JPA 2と「レガシー」Hibernate DDLアクションを組み合わせたも使用できます。org.hibernate.tool.schema.Action Enum

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

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

…およびenum両方の内部値でありorg.hibernate.boot.SchemaAutoToolingorg.hibernate.tool.schema.Action公開されていません。

以下に、サンプルのプログラムDataSourceのおかげに策略を使用して(私の春ブートアプリケーションのものに使用される)の構成.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

誰がデフォルト値を検索するか...

これは、spring-bootのバージョン2.0.5およびJpaPropertiesの1.1.0のソースコードで記述されています。

    /**
     * DDL mode. This is actually a shortcut for the "hibernate.hbm2ddl.auto"
     * property. Defaults to "create-drop" when using an embedded database and no
     * schema manager was detected. Otherwise, defaults to "none".
     */
    private String ddlAuto;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.