10

NHibernateを追加して実験しているレガシーシステムを使用しています。テーブルにマップする必要があるクラスがありますが、仮想ではない既存のメソッドがたくさんあります。

マッピングファイルのクラス要素の「lazy」属性を「false」に設定すると、非仮想メソッドが存在する場合でも、NHibernateでマッピングを正常にロードできることがわかりました。これが、このクラスでのNHibernateの使用にどのような影響を与えるのか疑問に思っています。

オブジェクトに属するコレクションでの非遅延読み込みの意味は理解していますが、クラスでの遅延読み込みまたは熱心な読み込みの意味がわかりません。それは、そのオブジェクトに属するすべてのコレクションが熱心にロードされることを意味しますか?それとも、NHibernateが実際のクラスの代わりに動的プロキシを使用しなくなったことを意味しますか?他に何かありますか?

また、ここでの最善の行動方針は何ですか?そのlazy=false値を設定することはお勧めできませんか?クラスが実装するインターフェイスを作成し、それをテーブルにマップする必要がありますか?それとも、弾丸をかじって、クラス仮想の既存のすべてのメソッドにマークを付ける必要がありますか?

アドバイスをよろしくお願いします!

4

3 に答える 3

5

NHIbernate のクラス レベルで常に lazy=false を指定します。これは、クラス モデルでこれが必要ない場合に、NHibernate によってプロパティが仮想であることを強制的に宣言されることを望まないためです。

クラス マッピングで 'lazy' を指定すると (デフォルト)、NHibernate は実行時に 'Dynamic Proxy' クラスを使用します。この動的プロキシは、クラスから継承するクラスです。次に、私が理解している限り、クラスのインスタンスは遅延/オンデマンドで初期化する必要があります。場合によっては、これによりパフォーマンスが向上するはずです (少なくとも、そう言われています)。

しかし、NHibernate が自分のクラスがどのように見えるべきかを教えてくれるのが好きではないので、私は常にすべてのクラスに lazy=false を指定しており、まだ問題に遭遇していません。:)

于 2009-03-03T14:15:20.987 に答える
2

遅延読み込みを使用すると、オブジェクトの数を制限するのに非常に効果的です。この機能は、特定の状況で非常に役立ちます。たとえば、ユーザーとロールの 2 つのオブジェクトがあり、すべてのユーザーが 1 つ以上のロールを持っているとします。ユーザー オブジェクトをロードするときは、関連付けられているすべてのロールもロードする必要があります。ただし、そのユーザーのロールをロードする場合、そのロールに関連付けられているすべてのユーザーをロードすることは望ましくありません。これは、ユーザーのデータベース全体をロードすることになる可能性があるためです。

そのため、lazy = false を設定すると、呼び出し元のインスタンスが読み込まれるときに、リレーションシップのオブジェクトのコレクション全体が読み込まれます。場合によっては、これが問題なく適切な場合もありますが、パフォーマンスの問題が発生する場合もあります。

于 2009-03-03T14:19:59.117 に答える
1

ロブ、それは悪いデザインです。ユーザーにはロールタイプのリストがありますが、ロールにはユーザータイプのリストはありません。Userは集約ルートです。すべてのユーザーをロールに含めるには、UserのメソッドをGetByRole()に定義します。あなたが説明したような2方向トラバーサルは、恐ろしいドメインモデルを作成します。グーグルの「循環参照」とそれが悪い理由を見てください。

于 2009-05-10T06:07:58.893 に答える