Nhibernate-collection-mapping
NHibernate-コレクションマッピング
この章では、コレクションを表す方法について説明します。 次のようなNHibernate内で使用できるさまざまなタイプのコレクションがあります-
- リスト
- Sets
- Bags
現在、.NETの観点からは、一般的にリストなど、非常に単純なデータ構造、リスト、辞書を扱います。 .NETには、さまざまなコレクションタイプがありません。 それでは、なぜNHibernateはこれらすべての異なるタイプを必要としますか? 本当にデータベースに戻ります。
List
- リストは、必ずしも一意ではない要素の順序付きコレクションです。
- IList <T> を使用してこれをマッピングできます。
- したがって、従来はアドレスのリストがあり、アプリケーションの観点からは要素が一意であることはわかっていますが、リストには重複した要素をリストに挿入することを妨げるものはありません。
Set
- セットは、一意の要素の順序付けられていないコレクションです。 2つの重複する要素をセットに挿入しようとすると、例外がスローされます。
- NHibernateにはそれについて特別なことは何もありません。
- これは、汎用セットを実装する便利な方法です。 .NET 4を使用している場合は、新しい HashSet <T> を使用してこれらを表すことができますが、ほとんどのNHibernateアプリケーションでは、これをISetと表します。
- 順序付けされていないため、データベースからアドレスのリストまたは順序のリストを引き戻した場合、特定のOrder by句を指定しない限り、アドレスの順序はわかりません。
- したがって、一般的に、データベースからプルバックするデータはセットです。
- これらは、順序付けられていない要素の一意のコレクションです。
Bag
- データベースの世界で見られるもう1つの一般的なコレクションはバッグです。これは、重複する要素を持つことができる点を除いて、セットに似ています。
- .NETの世界では、これをIListで表します。
セットはおそらく最も一般的ですが、アプリケーションに応じてリストとバッグも表示されます。 Set順序が定義されている最後の章の customer.hbm.xml ファイルを見てみましょう。
ご覧のとおり、ordersコレクションをセットとしてマップしました。 セットは一意の要素の順不同のコレクションであることを忘れないでください。
これで、Customerクラスを見ると、次のプログラムに示すように、OrdersプロパティがISetで定義されていることがわかります。
このアプリケーションを実行すると、次の出力が表示されます。
コレクション内のアイテムが一意である必要がない場合、このコレクション内で同じプライマリキーを持つ複数の注文が複数回発生する可能性がある場合、次のプログラムに示すように、これをバッグとしてマッピングする方が適切です。
このアプリケーションを実行すると、例外が発生します。顧客クラスを見ると、注文がC#コードでISetとしてマークされていることに気付くでしょう。
したがって、これをIListに変更する必要があります。次に、コンストラクターでHashSetからListに変更する必要があります。
アプリケーションを実行すると、同じ動作が見られます。 しかし、同じコレクション内で複数回注文を行うことができます。