私は本当に更新、エクスポート、そしてhibernate.hbm2ddl.auto
に与えることができる値についてもっと知りたいです。
アップデートを使用するタイミングと使用しないタイミングを知っておく必要がありますか?そして代替手段は何ですか?
これらはDB上で起こり得る変更です:
それぞれの場合において、最良の解決策は何ですか?
hibernate.hbm2ddl.auto SessionFactoryが作成されたときに、スキーマDDLを自動的に検証またはデータベースにエクスポートします。 create-dropを使用すると、SessionFactoryが明示的に閉じられたときにデータベーススキーマが削除されます。
例えば検証更新する作成する作成ドロップ
だから可能なオプションのリストは、
これらのオプションは開発者向けのツールであり、本番レベルのデータベースを容易にすることを目的としていないようです。次の質問を見てください。 休止状態:hbm2ddl.auto =製品版を更新しますか?
それを完全に無効にするための "none"という文書化されていない値もあります。
設定プロパティはhibernate.hbm2ddl.auto
と呼ばれます
開発環境では、デプロイするたびにクリーンなデータベースを削除および作成するようにhibernate.hbm2ddl.auto=create-drop
を設定して、データベースが既知の状態になるようにします。
理論的には、モデルへの変更でデータベースを更新するようにhibernate.hbm2ddl.auto=update
を設定できますが、本番データベースではそれを信頼しません。ドキュメントの以前のバージョンは、これは少なくとも実験的なものであると述べました。現状はわかりません。
したがって、本番データベースではhibernate.hbm2ddl.auto
を設定しないでください - デフォルトではデータベースは変更されません。代わりに、あるバージョンから次のバージョンへの変更を適用するSQL DDL更新スクリプトを手動で作成します。
データベースの更新には liquibase を使用します。 Hibernateのスキーマ更新機能は本当に唯一のo.kです。彼らが新機能を開発している間、開発者のために。実稼働環境では、dbのアップグレードはより慎重に処理する必要があります。
それはかなり古い投稿ですが、私はトピックに関するいくつかの研究をしたようにそれを共有することを考えました。
hibernate.hbm2ddl.auto
ドキュメントによれば、4つの有効な値を持つことができます。
作成|更新する検証create-drop
以下は、これらの値によって示される動作の説明です。
注目に値する重要な点は次のとおりです。
Table not found:<table name>
もし私がこのプロパティに何か値を与えた場合(上記の4つの値の代わりにabcと言う)、またはそれは単に空白のままにされます。次のような動作が見られます。
- スキーマがDBに存在しない場合: - スキーマを作成します。
- スキーマがDBに存在する場合: - update スキーマ。
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">
まず、hbm2ddl
設定プロパティに設定可能な値は次のとおりです。
none
- アクションは実行されません。スキーマは生成されません。create-only
- データベーススキーマが生成されます。drop
- データベーススキーマは後で削除され作成されます。create
- データベーススキーマは後で削除され作成されます。create-drop
- データベーススキーマは後で削除され作成されます。 SessionFactory
を閉じると、データベーススキーマは削除されます。validate
- データベーススキーマはエンティティマッピングを使用して検証されます。update
- データベーススキーマは、既存のデータベーススキーマとエンティティマッピングを比較して更新されます。私は ブログ記事 を最も一般的なHibernate DDL生成戦略に捧げました。
hibernate.hbm2ddl.auto="update"
は便利ですが、関数の追加やカスタムスクリプトの実行を計画している場合は柔軟性が劣ります。ただし、Flywayを使用しても、hbm2ddlを使用して初期移行スクリプトを生成することはできます。 この記事 では、JPA Entity ModelとjOOQ Table Modelを組み合わせる方法を見ることができます。
アプリケーションで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";
私はあなたがに集中する必要があると思います
SchemaExport Class
このクラスはあなたの設定を動的にするので、それはあなたがあなたが一番良いスイートを選ぶことを可能にします...
チェックアウト [SchemaExport]
validate
:スキーマを検証します。データベースは変更されません。update
:現在の実行クエリでスキーマを更新します。create
:毎回新しいスキーマを作成し、以前のデータを破壊します。create-drop
:アプリケーションが停止したとき、またはSessionFactoryが明示的に閉じられたときにスキーマを削除します。validate
:スキーマを検証し、DBに変更を加えません。
マッピングファイルに新しい列を追加して挿入操作を実行すると、既存のスキーマは挿入しようとしているオブジェクトと異なるため、 "XYZ列がありません"という例外がスローされます。新しい列を手動で追加してテーブルを変更してからInsert操作を実行すると、新しい列と共にすべての列が確実にテーブルに挿入されます。変更を加えないこと/既存のスキーマ/テーブルを変更することを意味します。
update
:操作を実行するとデータベース内の既存のテーブルを変更します。 hbm2ddlのこのオプションで列を追加または削除できます。しかし、 'NOT NULL'である新しい列を追加しようとしているのであれば、その特定の列をDBに追加することは無視されます。既存のテーブルに「NOT NULL」列を追加する場合は、テーブルは空でなければならないためです。
5.0 以降、これらの値は専用のEnum
で見つけることができます。 org.hibernate.boot.SchemaAutoTooling
(5.2以降の値NONE
で拡張)。
さらに良いことには、 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 ) );
…と 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();
}