Hibernate オブジェクト グラフを UI で使用する前にロードする最良の方法は何ですか?
質問
状況は次のとおりです。
- 控えめなロードが定義されているオブジェクトグラフを使用した冬眠コンテキストがあります。
- どこかにデータをコピーする必要がないように、UIの冬眠オブジェクトを使用する必要があります。
- 異なる量のデータを必要とする異なるUIコンテキストがあります。
- データは大きすぎてグラフ全体を毎回ロードすることができません。
データベースに戻ってさらにデータをロードしなくてもアクセスできるように、オブジェクト グラフ内のすべての適切なオブジェクトを構成可能な方法でロードするための最良の手段は何ですか?
助けてください。
解決
あなたにはクライアントがいて、ある時点で彼の注文に関して何かをしなければならず、おそらく彼はその注文に対してボーナスを持っているとします。
次に、次のようなことを可能にする流暢なインターフェイスを備えたリポジトリを定義します。
new ClientRepo().LoadClientBy(id)
.WithOrders()
.WithBonus()
.OrderByName();
そして、クライアントには必要なものがすべて揃っています。現在の操作に何が必要かを事前に知っておくことが望ましいです。こうすることで、データベースへの不要なアクセスを回避できます (チームの新しい開発者は通常これを行います。プロパティを呼び出しますが、実際には DB への呼び出しであるという事実は認識しません)。
他のヒント
Web アプリで Spring を使用している場合は、OpenSessionInViewFilter が問題の解決策となる可能性があります。
私たちのプロジェクトで使用するアプローチは、ビューごとにサービスを作成することです。次に、ビューはこの特定のビューに必要なサブグラフをフェッチし、データベースに送信される SQL の数を常に削減しようとします。したがって、n:1 の関連オブジェクトを取得するために多くの結合を使用しています。
DB に直接接続された 2 層デスクトップ アプリを使用している場合は、オブジェクトを接続したままにし、いつでも追加データを自動的にロードできます。それ以外の場合は、セッションに再接続し、必要な関連付けを初期化する必要があります。 Hibernate.initialize(Object entity, String propertyName)
(メモリ不足のため、100%正しくない可能性があります)