6

私は昨日ずっと Hibernate に関するさまざまな記事やチュートリアルを読んでいました。その強力さに圧倒されましたが、大きな懸念事項が 1 つあります

標準的な方法は、Hibernate が DB スキーマを設計/生成できるようにすることです。これは、私が窒息している新しい恐ろしい概念です。私が読んだチュートリアルから、構成ファイルに新しいエンティティを追加し、必要hibernate.cfg.xmlなPOJOに注釈を付けるだけで@Entity、出来上がり-Hibernateがテーブルを作成します。これは非常にクールですが、いくつかのシナリオについて疑問に思っています。

  • すでに DB スキーマがあり、Hibernate が生成しようとしているスキーマがそれに準拠していない場合はどうなりますか? 事前に定義された (Hibernate 以外の) スキーマに屈することを拒否する狂気の DBA がいる場合はどうなるでしょうか?
  • (世界中のすべての都市のように) 何万ものレコードを含む参照テーブルがある場合はどうなるでしょうか? インスタンス化してsave()何万もの一意の POJO を作成する必要がありますか?それとも、Hibernate を構成してテーブルに既に存在するデータを上書きしないようにする方法はありますか?
  • スキーマ/テーブルでパフォーマンス チューニングを行いたい場合はどうしますか? これには、Hibernate が自動的に作成する以上のインデックス作成、正規化が含まれますか?
  • テーブルに制約やトリガーを追加したい場合はどうすればよいでしょうか? インデックス?

これの根底にあるのは次のようなものだと思います。

Hibernate が DB に特定のスキーマ/構成を作成して強制しているようです。このアジェンダが、私たちのプラットフォーム標準、DBA 哲学、および Hibernate がやり取りするテーブルを調整/微調整する能力とどのように矛盾するのか疑問に思っています。

前もって感謝します。

4

9 に答える 9

5

ハイバネートに力を与えすぎていると思います。

Hibernate には、データベースの実装に影響を与えるイディオムがあります。

ユーザーが要求しない限り、 Hibernate はスキーマを生成しません。Hibernate を使用して、既存のスキーマから開始し、それを Java オブジェクトにマップすることができます。ただし、スキーマが Hibernate の要件と競合する場合、それは不可能または最適ではない可能性があります。

DBA が動揺しない場合、または Hibernate が対応できない場合は、答えがあります。Hibernate を使用することはできません。

DBA は同意するかもしれませんが、アプリは、Hibernate によって生成された動的 SQL が必要なものではないことに気付くかもしれません。

幸いなことに、町で唯一のゲームではありません。

実装がすべてかゼロである必要はないと思います。単純な JDBC を使用して参照データにアクセスすると、何が問題になるでしょうか?

データベース設計の考慮事項は、Hibernate から独立している必要があります。制約、トリガー、正規化、およびインデックスは、ミドルウェアの選択ではなく、ビジネス ニーズによって決定される必要があります。

しっかりしたオブジェクト モデルがない場合、またはスキーマが対応できない場合は、Hibernate を再検討する必要があります。代替手段として、ストレート JDBC、ストアド プロシージャ、Spring JDBC、および iBatis があります。

于 2012-06-21T16:38:23.760 に答える
2

Hibernateには、オブジェクトをテーブルにマップするデフォルトの方法が付属しています。いくつかのツール/ライブラリのように、単純化のために設定より規約を優先します。

ただし、エンティティをデータベーステーブルに別の方法でマップする場合は、これらがどのようにマップされるか(テーブル名の変更などの単純な属性から、関連するエンティティ間の外部キー関係の再定義、およびこれがどのように維持されるかまで)をHibernateに明示的に伝えることができます。 )。

これを正しく行うと、既存のデータをインスタンス化して保存する必要がなくなります。これは無意味です。データベースには、Hibernateが理解できる形式でエンティティに関する情報がすでに含まれています。(それについて考えてください-エンティティをロードしてすぐに保存することは常にノーオペレーションでなければならないので、完全にスキップすることができます。)

したがって、あなたの質問に対する簡単な答えは「いいえ」です。テーブルの設計を気にしない場合は、Hibernateに適切なデフォルトを採用させることができます。ただし、スキーマを明示的に設計する場合は、これを実行してから、その正確なスキーマをHibernateに記述できます。

于 2012-06-21T16:39:20.427 に答える
2

企業で長い間 Java と休止状態に取り組んできた者として、私はこの機能を使用するプロジェクトをほとんど見たことがありません。いくつかのビルド ツールなどでこれが行われていることがわかりますが、実際のエンタープライズ アプリでは、これは見たことがありません。

ほとんどの DBA は、アプリケーション ユーザーがテーブルを作成することを許可しません。それらは特権ユーザーに依存してこれらのことを行い、アプリが接続するユーザーは、スキーマ自体ではなく、データに対する読み取り/書き込み特権を持っています。

その結果、自分で SQL を記述し、一致するように休止状態のマッピングを行います。オブジェクトの設計が SQL に影響しないという意味ではありませんが、常にスキーマを事前に作成する必要があります。

于 2012-06-21T16:45:56.997 に答える
1

いいえ。Hibernate ツールを使用して、既存のデータベースからエンティティを生成できます。

Hibernate を使用するには、2 つの方法があります。優れた DBA またはデータベース設計者がいる場合は、データベースを設計してから休止状態にマップすることをお勧めします。一方、DBA がなく、優れた開発者がいる場合は、Hibernate にデータベースを生成させてください。

Hibernate の背後にある概念は、データベースとオブジェクトをマップすることです。そのため、ORM (Object-Relational Mapping) ツールと呼ばれます。オブジェクト リレーショナル インピーダンスについては、こちら
を参照して ください。

于 2012-06-21T16:38:15.900 に答える
0
  • すでにDBスキーマがある場合はどうなりますか...

どこでその印象を受けるのかわかりません。Hibernateは既存のスキーマを使用できます。非常に柔軟です。

  • 参照テーブルがある場合はどうなりますか...

リレーションシップをLAZYにすると、自動的にロードされません。変更されたオブジェクトのみが保存されます。

  • パフォーマンスチューニングを行いたい場合はどうなりますか...

生成されたスキーマは使用しないでください。それは出発点にすぎません。必要に応じてカスタマイズできます。

  • テーブルに制約またはトリガーを追加したい場合はどうなりますか?インデックス?

上記のようにいくつか。

于 2012-06-21T16:42:22.910 に答える
0

既存のデータベーススキーマでHibernateを使用できます。さまざまな注釈を使用して、既存のテーブルと列にマップできます。次に例を示します。

@Table(name = "dbschema.dbTable")-クラスファイルの前に配置してマップする必要があります@Column(name = "colName")-列をマップするには

hibernateが次のオプションで構成されていることを確認してください:hibernate.hbm2ddl.auto = update

これを作成するように設定すると、スキーマが作成されるため、このような場合は行わないでください。

于 2012-06-21T16:42:34.537 に答える
0

これは、手っ取り早いプロトタイプや簡単なチュートリアルに適した方法ですが、実稼働アプリケーションに適した方法とはほど遠いものです。私は主に、スクリプトを使用してスキーマ、テーブル、ビュー、インデックスなどを生成し、スキーマをエンティティにマップして、データベースを個別に設計することを好みます。

マッピングがデータベース内のテーブルと列を検出する限り、すべてが正常です。

データベースにデータがあり、スキーマを変更する必要があるとすぐに、とにかく移行スクリプトを作成する必要があります。すべてを削除して最初からやり直すことはできません。チュートリアルは、Hibernateから始めて、複雑なSQLスクリプトを処理せずにHibernateをできるだけ早く発見する必要がある開発者向けに書かれています。

于 2012-06-21T16:40:08.360 に答える
0

適切な場合は hibernate/jpa を使用してください。アプリを設計する際の一般的な方法は、ドラフトを抽出し、必要に応じて手動で変更することです (インデックスなど)。ただし、データベースのレイアウトを休止状態から変更すると、面倒なことになります。JPA の多くの美しさが失われます。パフォーマンスの大幅な調整と完全な制御が必要なタスクの場合は、reguar jdbc を使用してください。

于 2012-06-21T16:46:57.263 に答える
0

いくつかの回答:
A. インデックス アノテーションを追加することは可能です。テーブルアノテーションを参照してください。

B. 参照テーブルがある場合、レイジー フェッチまたはイーガー フェッチを選択できます (つまり、テーブルが人物とその本を表す場合、人物を本なしでロードするか、本とともにロードするか)

C. Hibernate は既存のスキーマで作業するために使用されます。スキーマを操作するのは簡単ではないかもしれませんが、他の人が言ったように、フレームワークの慣習に従ってではなく、ビジネス ニーズに従ってのみ db を設計する必要があります

。 " - プロキシを頻繁に使用するため、パフォーマンスが低下します。セッションの範囲と、第 1 レベルおよび第 2 レベルのキャッシュの使用法をよく理解する必要があります。

. E.セクションDで書いたことに従ってください-トリガーを使用すると、休止状態になるとDBが「フードの下」で変更されます。レコードを更新すると (トリガーを使用して) アーカイブ テーブルにエントリが作成される場合を考えてみましょう。このテーブルにも休止状態を介して注釈が付けられているとし
ます。休止状態のキャッシュは、アプリケーション スコープ外で発生した変更を認識しません。

F. 私が Hibernate に反対ではないことを述べておくことは重要ですが、すべてのソリューションに Hibernate を使用するべきではありません。これは私が過去に犯した間違いです。私は現在、Spring-JDBC を使用していますが、非常に満足しています (私たちのアプリケーションのニーズでは、Hibernate を使用するのは難しいでしょう。これは、複数の DB フレーバーをサポートする必要がある場合にのみ考慮すると思います)。

于 2012-06-21T18:58:29.777 に答える