回答:
hibernate.hbm2ddl.auto SessionFactoryの作成時に、スキーマDDLを自動的に検証またはデータベースにエクスポートします。create-dropを使用すると、SessionFactoryが明示的に閉じられると、データベーススキーマが削除されます。
例:検証| 更新| 作成| 作成ドロップ
可能なオプションのリストは、
これらのオプションは、開発者向けツールであり、本番レベルのデータベースを容易にするためのものではないようです。次の質問をご覧ください。Hibernate:hbm2ddl.auto = update in production?
ドキュメント化されていない「none」の値もあり、完全に無効にできます。
構成プロパティが呼び出されます hibernate.hbm2ddl.auto
私たちの開発環境では、 hibernate.hbm2ddl.auto=create-drop
、データベースを既知の状態にするために、展開するたびにクリーンなデータベースを削除して作成するようしました。
理論的には、 hibernate.hbm2ddl.auto=update
モデルの変更でデータベースを更新するように、実稼働データベースではそれを信頼しません。ドキュメントの以前のバージョンでは、これは少なくとも実験的なものであると述べていました。現在の状況はわかりません。
したがって、本番データベースでは設定しないでくださいhibernate.hbm2ddl.auto
。デフォルトでは、データベースは変更されません。代わりに、あるバージョンから次のバージョンへの変更を適用するSQL DDL更新スクリプトを手動で作成します。
私はあなたのdbを更新するためにliquibaseを使用します。hibernateのスキーマ更新機能は、実際には開発者が新しい機能を開発している間のみ問題ありません。本番環境では、dbアップグレードをより注意深く処理する必要があります。
それはかなり古い投稿ですが、私はこのトピックについていくつかの研究をしたので、それを共有することを考えました。
hibernate.hbm2ddl.auto
ドキュメントに従って、4つの有効な値を持つことができます。
作成| 更新| 検証| 作成ドロップ
以下は、これらの値によって示される動作の説明です。
以下は、注目に値する重要なポイントです。
Table not found:<table name>
このプロパティに値を指定した場合(たとえば、上記の4つの値の代わりにabcとする)、または空白のままにします。次の動作を示します。
-スキーマがDBに存在しない場合:-スキーマを作成します
-スキーマがDBに存在する場合:- スキーマを更新します。
まず、hbm2ddl
構成プロパティの可能な値は次のとおりです。
none
-アクションは実行されません。スキーマは生成されません。create-only
-データベーススキーマが生成されます。drop
-データベーススキーマは後で削除され、作成されます。create
-データベーススキーマは後で削除され、作成されます。create-drop
-データベーススキーマは後で削除され、作成されます。を閉じるSessionFactory
と、データベーススキーマが削除されます。validate
-データベーススキーマは、エンティティマッピングを使用して検証されます。update
-データベーススキーマは、既存のデータベーススキーマとエンティティマッピングを比較することによって更新されます。私は最も一般的なHibernate DDL生成戦略についてブログ投稿を捧げました:
hibernate.hbm2ddl.auto="update"
あなたが機能を追加したり、いくつかのカスタムスクリプトを実行する予定がある場合に便利が、あまり柔軟性があります。ただし、Flywayを使用している場合でも、hbm2ddlを使用して初期移行スクリプトを生成できます。で、この記事では、あなたがjOOQ表モデルでJPAエンティティモデルを組み合わせることができますどのように見ることができます。
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">
アプリで文字列を使用したくなく、事前定義された定数を探している場合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";
validate
:スキーマを検証し、DBに変更を加えません。
マッピングファイルに新しい列を追加して挿入操作を実行すると、既存のスキーマが挿入するオブジェクトと異なるため、「XYZ列がありません」という例外がスローされます。新しい列を手動で追加してテーブルを変更し、挿入操作を実行すると、すべての列が新しい列とともにテーブルに確実に挿入されます。既存のスキーマ/テーブルを変更/変更しないことを意味します。
update
:操作を実行すると、データベース内の既存のテーブルが変更されます。hbm2ddlのこのオプションを使用して、列を追加または削除できます。ただし、「NOT NULL」である新しい列を追加する場合、その特定の列をDBに追加することは無視されます。既存のテーブルに「NOT NULL」列を追加する場合、テーブルは空でなければならないためです。
5.0以降、専用のEnum
:でこれらの値を検索できるようになりましたorg.hibernate.boot.SchemaAutoTooling
(NONE
5.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.SchemaAutoTooling
、org.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();
}
誰がデフォルト値を検索するか...
これは、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;