web-dev-qa-db-ja.com

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

私は自分のSpring起動アプリプロジェクトに取り組んでいましたが、別のサーバー(SQL Server)上のデータベースへの接続タイムアウトエラーが発生することがあることに気付きました。 FlyWayを使ってスクリプトを移行しようとすると、これが特別に発生しますが、数回試してもうまくいきます。

それから私は自分のプロパティファイルでspring.jpa.hibernate.ddl-autoを指定していないことに気づきました。私はいくつかの調査をしましたが、開発中にspring.jpa.hibernate.ddl-auto= create-dropを追加することが推奨されることを知りました。プロダクション環境ではspring.jpa.hibernate.ddl-auto= noneに変更してください。

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

53
METTAIBI

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

createcreate-dropvalidate、およびupdateは、基本的にスキーマツール管理が起動時にデータベーススキーマをどのように操作するかに影響します。

たとえば、update操作はJDBCドライバのAPIに問い合わせてデータベースメタデータを取得し、次にHibernateは注釈付きクラスまたはHBM XMLマッピングの読み取りに基づいて作成したオブジェクトモデルを比較し、その場でスキーマを調整しようとします。

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

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

開発において、開発者がupdateを使用してスキーマを自動的に変更し、再起動時に新しい追加を追加するのが一般的です。しかし、やはり理解してください、これはもはや必要ではない以前の実行から存在するかもしれないカラムまたは制約を削除しません。

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

99
Naros