Hibernateを使用してデータベーススキーマを作成する方法
質問
Hibernate:hbm2ddl.auto = update in production?を読んだ後、いくつかの質問が生じました。 。 まず、Hibernateを使用する理由は、データベースベンダーに依存しないことです(「同じ」sqlクエリの10バージョンを書く必要がない、たとえばtsqlとsql)。
データベーススキーマ(運用環境)を作成するときに問題が発生します。私が見る限り、2つの選択肢があります。
- hbm2dll =更新
- pure sql(ddl)スクリプト。
最初の選択肢は、上記のスレッドで広く議論されています。 2番目の選択肢は、最初の問題「データベースベンダーに依存するsqlステートメントを作成したくない」に戻ったことを意味するため、悪いです。 (" all"(少なくともデータベースHibernateサポート)が DDLを実装している場合、このステートメントはfalseになる可能性があります。 (データベースの構造の定義と検査に使用されるSQLのサブセット。)等しい)。
解決
開発/ステージングモードですべての変更を行い、運用環境でスクリプトを手動で(または自動的に転送し、実行しますが、Hibernateでスクリプトを実行しないでください)。 hbm2ddl更新ではすべてのケースがカバーされるわけではないため、スクリプトには調整が必要な場合があります。
実際、Hibernateでデータベースに対してddlを実行することはありません。 hbm2ddlを使用してテキストを生成します:
org.hibernate.tool.hbm2ddl.SchemaExport --config=hibernate.cfg.xml --text --format --delimiter=;
org.hibernate.tool.hbm2ddl.SchemaUpdate --config=hibernate.cfg.xml --text --format --delimiter=;
他のヒント
通常、JPAスキーマをダンプするツールは、静的メタデータのみを読み取る SchemaExport
ツールに基づいています。
Maven / Gradleプラグイン https://github.com/Devskiller/jpa2ddl がありますJPAスキーマを生成します。には、すべてのプロパティ、命名戦略、ユーザータイプなどが含まれます。
Flyway の自動スキーマ移行を生成するためにも使用できます。
私はHibernate(LOT)が好きで、信じられないほど良い品質のコードを作ると思いますが、私は非常によく作られたハイイログマの子守をさせたよりもすぐに本番データベースでそれを緩めることはありません。すべてがしばらくはうまくいく可能性がありますが、それが悪くなる1つのインシデントは本当に悪いです。
私の提案はテスト環境で、Hibernateにデータベーススキーマを生成させることです。テスト環境でそれらをテストします。次に、これらのスクリプトを実稼働環境に持ち込んで実行します。特異性に注意してください。テストが素晴らしく成功したとしても、私はまだHibernateが実稼働サーバー上でワイルドになることを許可しません。 Hibernate schemagenの出力を取得してテストし、検証されたら、それを実稼働サーバーにデプロイします。