私は自分の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
の値を使用してデータベーススキーマを生成するのか実際にはわかりませんでした。それが実際にどのように機能するのか、および開発および本番サーバーでこのプロパティを使用する際の推奨事項は何かを技術的に説明してください。ありがとうございました
レコードの場合、spring.jpa.hibernate.ddl-auto
プロパティはSpring Data JPA固有のものであり、最終的には認識されているプロパティhibernate.hbm2ddl.auto
の下でHibernateに渡される値を指定するための方法です。
値create
、create-drop
、validate
、およびupdate
は、基本的にスキーマツール管理が起動時にデータベーススキーマをどのように操作するかに影響します。
たとえば、update
操作はJDBCドライバのAPIに問い合わせてデータベースメタデータを取得し、次にHibernateは注釈付きクラスまたはHBM XMLマッピングの読み取りに基づいて作成したオブジェクトモデルを比較し、その場でスキーマを調整しようとします。
たとえばupdate
操作は、新しい列や制約などを追加しようとしますが、以前に存在していた可能性があるが以前の実行からオブジェクトモデルの一部としては削除されていない列または制約を削除しません。
通常、テストケースのシナリオでは、スキーマを作成し、テストケースでモックデータを追加し、テストを実行し、テストケースのクリーンアップ中にスキーマオブジェクトが削除され、空のデータベースが残るようにcreate-drop
を使用することになります。 。
開発において、開発者がupdate
を使用してスキーマを自動的に変更し、再起動時に新しい追加を追加するのが一般的です。しかし、やはり理解してください、これはもはや必要ではない以前の実行から存在するかもしれないカラムまたは制約を削除しません。
本番環境では、none
を使用するか、単にこのプロパティを指定しないことを強くお勧めします。これは、特にデータベースが複数のサービスやアプリケーションで共有されている場合、データベース管理者がデータベースの変更について移行スクリプトを確認するのが一般的な方法であるためです。