NHibernateのリストとセットとバッグ


109

NHibernateマッピングファイルのリスト、セット、バッグの違いは何ですか?それぞれは.NETコレクションとどのように関連していますか?

回答:


230

NHibernateセマンティクス:

  1. リスト:エンティティの順序付けられたコレクション、重複が許可されています。IListコードで.NET を使用します。インデックス列はNHibernateでマップする必要があります。

  2. セット:一意のエンティティの順不同のコレクション。重複は許可されていません。Iesi.Collection.ISetコードで使用(v4より前のNH)またはSystem.Collections.Generic.ISet(NH v4 +)。重複のビジネス定義をオーバーライドGetHashCodeEqualsて示すことが重要です。orderbyを定義するか、SortedSet結果をもたらす比較子を定義することにより、ソートできます。

  3. バッグ:エンティティの順序付けられていないリスト、重複が許可されています。ICollection<T>コードで.NET を使用します。リストのインデックス列はマッピングされておらず、NHibernateによって受け入れられません。


再:#2、ISet代わりに通常だけを使用することはできませんIesiか?
Sergei Tachenov 16

@SergeyTachenov:可能な回答については、stackoverflow.com / questions / 9222058 /…を参照してください。この回答が書かれたとき、ISetは.netの一部ではありませんでした
Michael Gattuso

NHibernate 4以降、その質問に対する最も人気のない答えは「はい」です。そのため、この質問も編集する必要があるかもしれません。
セルゲイタシェノフ2016

21

NHibernateのこれらのオブジェクトはすべて、これらの抽象データ型(ADT)の他の実装とまったく同じです。名前が他のものと共通しているため、セットやバッグをオンラインで見つけるのがいかに難しいかに驚いたので、ここにいくつかのリンクと説明をリストしました。

詳細については、以下をご覧ください。 リストセットバッグ

一般的なルールは次のとおりです。

リストはデフォルトで順序付けられています。オブジェクトをそのインデックスで引き出すことができるようにしたい場合、またはforループのループが奇妙に好きな場合は、これらを使用してくださいforeachリンクリストで必要となるような順序でそれらにアクセスする必要はありません。このADTは重複を許可します。

ご注意ください!リストはBryanDが彼の回答で述べたように順序付けられていますが、コマンドによる順序を指定しない限り、HQLクエリを実行するときにデータベースから期待される順序でなければならないということはまったくありません。これが理由で、代わりにセットまたはバッグを使用することを好む人もいます。そのため、注文されたように見えません。私はこれを言いますが、NHibernateが実行するクエリで見つかった順にリストに追加されるため、ほとんどの場合、それらは目に見える順序で表示されます。

セットはデフォルトでは順序付けされておらず、インデックスを介して変数に直接アクセスすることはできません。セットは、デフォルトで、オブジェクトの一意性を維持する上記3つのうちの唯一のADTです。重複を含めないようにする必要がある場合は、コレクションがある場合に最適です。

バッグ(またはマルチセット)は、上記のリンクからわかるように、セット内のオブジェクトを他のオブジェクトの複製にできるタイプのセットです。リストの順序は無視できるため、通常は使用されず、バッグとして扱われます。

これらがNHibernateでどのように使用されるかに関しては、ここで選択するADTに応じてデータベースから何も引き出されません。それは、別のADTを選択させるために使用するものです。

個人的には、子オブジェクトは一意である必要があり、順序付けは問題ではないため、ほとんどの場合にセットを使用します。私は、たとえば時間など、何かで順序付けしたいオブジェクトのグループがあるリストを使用しますが、この順序を達成するには、HQLクエリで「order by」を手動で設定する必要があります。


2
リストの修正-NHibernateマッピングファイルでリストを使用するには、インデックス列をマッピングする必要があります。この方法では、リストは、それが中に置かれた正確な順序で引き出されます。
マイケル・ガットゥーゾ

@Michael Gattuso良い点です。上の回答で、マッピングファイルの実際のコレクション仕様ではなく、HQLクエリ(したがって「order by」コメント)について話していることを述べたはずです。
ジェイ

バッグを使用する利点の1つは、バッグに新しい要素を追加するときに、バッグをデータベースからロードする必要がないことです。チェックする重複、決定する順序はありません。
tvaananen 2014年

1

主な違いは、リストには要素への暗黙的な順序があり、リスト内の位置によってインデックスが付けられることです。セットとバッグは、通常、これらのアイテムがDBから取得されるときに適用されるコンパレータまたはorder by句によって「順序付け」される場合もあります。個人的に、私はバッグを使用したことがありません...必要なデータが順番に並べられていることがわかっている場合は、リストを使用します。それ以外の場合は、セットを使用します。


0

セットでは、要素を繰り返すことはできません。新しい要素を追加しようとすると、既にコレクションにある各要素が追加した要素と比較され(Equalsメソッドが使用されます)、trueを返すと、要素は追加されません

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.