Answers:
NHibernate语义:
列表:实体的有序集合,允许重复。IList
在代码中使用.NET 。索引列将需要在NHibernate中进行映射。
设置:唯一实体的无序集合,不允许重复。使用Iesi.Collection.ISet
在代码(NH V4之前)或System.Collections.Generic.ISet
(NH V4 +)。覆盖GetHashCode
并Equals
指出重复项的业务定义很重要。可以通过定义orderby或通过定义比较器对SortedSet
结果进行排序。
袋:实体的无序列表,允许重复。ICollection<T>
在代码中使用.NET 。列表的索引列未映射,NHibernate不认可。
NHibernate中的所有这些对象与这些抽象数据类型(ADT)的其他实现完全相同。由于名称在其他事物上的通用性,我惊讶地发现在网上很难找到Sets and Bags,所以在这里列出了一些链接和说明。
一般规则是:
默认情况下,列表是有序的,如果您希望能够通过对象的索引拉出对象,或者对for
循环有一种怪异的循环,则可以使用这些列表foreach
。您不需要像访问“ 链表”中那样按顺序访问它们。此ADT允许重复。
请注意!尽管列表按BryanD的回答中的顺序进行排序,但是除非您通过命令指定顺序,否则绝对没有什么说它必须与您在执行HQL查询时从数据库中期望的顺序一致。正因为如此,有些人喜欢使用Set或Bags,因此不会给人以被订购的幻想。尽管我这么说,但大多数情况下它们会以可见的顺序出现,因为它们是按照在NHibernate运行的查询中找到的顺序添加到列表中的。
设置是不是默认排序,你不能直接通过索引访问任何变量。默认情况下,集合是以上三个中唯一保持其对象唯一性的ADT。如果您要求不包含重复项,那么如果您有一个馆藏,这些效果很好。
正如您从上面的链接中看到的那样,Bags(或Multisets)是一种Set类型,它确实允许其中的对象与其他对象重复。这些通常不使用,因为可以忽略列表排序,因此将其视为袋。
关于它们在NHibernate中的使用方式,根据您在此处选择的ADT,没有从数据库中提取任何内容的不同,正是您要使用它的原因,因此您应该选择不同的ADT。
就我个人而言,我将Sets用于大多数事情,因为我通常要求子对象是唯一的,并且排序不是问题。尽管我将使用列表,其中我有一组对象,这些对象要按某种顺序排序(例如,时间)以实现此顺序,但我需要在HQL查询中手动设置“ order by”。
ISet
而不是Iesi
?