spring.jpa.hibernate.ddl-autoプロパティは、Springで正確にどのように機能しますか?


126

Springブートアプリプロジェクトで作業していたところ、別のサーバー(SQL Server)上のデータベースへの接続タイムアウトエラーが発生することがありました。これは、スクリプトの移行を試みたときに特に発生しますFlyWayが、数回試行しても機能します。

次にspring.jpa.hibernate.ddl-auto、プロパティファイルで指定していないことに気付きました 。私はいくつかの調査を行いspring.jpa.hibernate.ddl-auto= create-drop、開発に追加することが推奨されていることを発見しました 。そして、それを次のように変更しspring.jpa.hibernate.ddl-auto= noneます。

しかし、実際にはどのように機能するのcreate-dropか、またはhibernateがor none値を使用してデータベーススキーマをどのように生成するのかは、実際にはわかりませんでした。それが実際にどのように機能するか、およびこのプロパティを開発および運用サーバーで使用するための推奨事項を技術的に説明できますか?ありがとうございました


1
FWIW JPA 2.1には標準プロパティjavax.persistence.schema-generation.database.actionがあるため、スキーマの生成にJPAベンダー固有のプロパティを使用する必要性を実際に確認しないでください。
Neil Stockton

@NeilStockton Hibernate 6で検討しているアイデアの1つは、カテゴリーに基づいてスキーマ生成を異なる方法で制御できる機能です。たとえば、あなたのormテーブルはそうかもしれませんnoneが、Hibernate SearchテーブルとEnversテーブルupdateはそれらのプロジェクトによって内部的に管理されており、手動で管理したくないので、を使用して生成したいかもしれません。現在、オリジン/ソースに関係なく、すべてのテーブルに対してこれをグローバルに制御しています。これは、これを使用したい場合にベンダー固有のオプションを使用する理由をさらに促進します。
Naros

回答:


212

レコードの場合、spring.jpa.hibernate.ddl-autoプロパティはSpring Data JPA固有であり、最終的にはそれが知っているプロパティの下でHibernateに渡される値を指定する方法hibernate.hbm2ddl.autoです。

値、、、createおよびcreate-dropvalidateupdate基本的に、起動時にスキーマツール管理がデータベーススキーマを操作する方法に影響します。

たとえば、updateオペレーションはJDBCドライバーのAPIにクエリを実行してデータベースメタデータを取得し、Hibernateが注釈付きクラスまたはHBM XMLマッピングの読み取りに基づいて作成したオブジェクトモデルを比較し、スキーマをオンザフライで調整しようとします。

updateたとえば、操作は新しい列や制約などを追加しようとしますが、以前に存在した可能性がある列や制約を削除することはありませんが、以前の実行のオブジェクトモデルの一部としては削除されません。

通常、テストケースのシナリオではcreate-drop、スキーマを作成し、テストケースでモックデータを追加し、テストを実行して、テストケースのクリーンアップ中にスキーマオブジェクトが削除され、空のデータベースが残るように使用します。

開発では、update再起動時にスキーマを自動的に変更して新しい追加を追加するために開発者が使用することがよくあります。ただし、これでも、以前の実行で不要になった可能性のある列や制約は削除されません。

本番環境ではnone、多くの場合、このプロパティを使用するか、このプロパティを指定しないことを強くお勧めします。これは、データベースが複数のサービスやアプリケーションで共有されている場合は特に、データベース変更の移行スクリプトを確認することはDBAにとって一般的な慣行だからです。


11
うん、本番環境ではddl生成を使用しないでください。ddlを使用してテーブル構造の初期スクリプトを生成し、そのプロセスにDBAを関与させます。次に、配置ユニットの一部としてdbスクリプトを含め、アプリケーションの配置時にFlywayを使用してそれらを実行します。データベースを変更する必要がある場合は、新しいスクリプトをアプリケーションの次のバージョンに追加し、ステージングに展開します。Flywayは自動的に現在のバージョンを検出し、データベースを最新バージョンにするために必要なスクリプトを実行します。すべてが機能する場合は、本番環境にデプロイします。
Klaus Groenbaek 2017

1
このプロパティを指定しないとどうなりますか?たとえば、私は自分の<bean id = "sessionFactory" class = "org.springframework.orm.hibernate5.LocalSessionFactoryBean"> ... ... <prop key = "hibernate.hbm2ddl.auto"> update </ prop>を持っています何らかの理由で、上記のプロパティを追加するまで、テーブルは常に削除されました。; PS:コードサンプルのため申し訳ありません)
Ţîganイオン

11
なぜvalidate生産環境ではないのですか?
Shamal Karunarathne

20
@ShamalKarunarathneアプリケーションは本番環境で使用できますvalidateが、通常、これは品質/テスト環境で使用する設定であり、データベース移行ツールに記述または適用したデータベーススクリプトが正確であることを確認します。validateプロダクションで使用しないもう1つの理由は、アプリケーションの起動プロセス中にボトルネックになる可能性があることです。特に、オブジェクトモデルのサイズが非常に大きい場合や、他のネットワーク関連の要因が関係している場合にそうです。
ナロス

1
正確なスタックトレースがなければ、推測するのは困難です。ただし、私の最初の推測orderは、エスケープされていない場合はキーワードであるため、SQLパーサーによって誤って解釈されていることです。
ナロス2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.