3

やや単純化された状況例: 信じられないほど「重い」ドメイン オブジェクトであるエンティティ A と B があります。データベースから 1 つをロードするのはかなり大変なことです。次に、エンティティ C があります。これは、ラベル文字列 A と B を持つ非常に単純なオブジェクトで、どちらもレイジーです。

C の巨大なリストを作成するために低レベルのクエリを実行しているので、CA と CB 用に保存する必要がある ID は正確にわかっていますが、オブジェクト全体を読み込んでプロパティに設定したくありません。オーバーヘッドは非常識です。

代わりに、ID を C エンティティに直接挿入し、後で必要な場合にのみ A および B プロパティを完全にロードできるようにしたいと考えています。

<sql-insert/>ドキュメントにタグが表示されていますが、そのセクションは本当にまばらです。

NHibernate フレームワーク内でやりたいことを実行する方法はありますか、それとも生の SQL を実行する必要がありますか? 可能であればデータベースの移植性を維持しようとしているため、生のオプションには敬遠されています。私が見逃しているより良い方法があるはずです。

4

2 に答える 2

1

NHibernate でこれが許可されているかどうかはわかりませんが (同じベース データの個別のオブジェクト)、通常は、本格的なオブジェクトにアップコンバートできる "ダイジェスト" オブジェクトを作成します (本格的なオブジェクトの遅延ロードを使用しても)。私は通常、コード生成または手動の ORM レイヤーでこれを行います。

通常、大規模なコレクションはダイジェストであり、必要なプロパティまたはメソッドがダイジェストによって公開されていない場合、それらは呼び出し用の完全なオブジェクトにアップコンバートされるか、渡されます。

于 2008-10-20T00:15:08.837 に答える
1

Dan -- これがテストなしで機能するかどうかはわかりませんが、試してみる価値はあります。Cに追加したいIDをすでに持っていると思います-したがって、関連付け(私が想定している多対1)をinsert="false"およびupdate="false"(おそらくcascade="none)に設定します"代わりに機能します)。次に、A エンティティと B エンティティの「空のコピー」を作成し、ID を追加して C に追加し、C を保存しようとします (Session.SaveOrUpdateCopy(C))。NHibernate が新しい A および B オブジェクトをそれぞれのテーブルに追加しようとせず、単に C テーブル内に正しい Id を設定するだけであることを願っています。この方法では、A および B エンティティをロードする必要はありません。

悪い点は、A と B を保存または更新する必要がある場合は、直接行う必要があることです。もう 1 つの悪い点は、これをテストする時間がないため、うまくいくかどうかわからないことです。

于 2008-10-20T14:38:00.203 に答える