NHibernate中的列表与集合与行李

NHibernate中的列表与集合与行李,nhibernate,Nhibernate,NHibernate映射文件中的列表、集合和包之间有什么区别?每个元素与.NET集合的关系如何?主要的区别在于列表对元素有一个隐式的排序,按元素在列表中的位置进行索引。成套设备和行李也可以“订购”,通常由比较器或order by子句进行订购,当这些项目从DB中出来时,将应用该子句。就我个人而言,我从来没有用过包。。。如果我知道我想要的数据是按顺序排列的,我就使用列表,否则我就使用集合。集合不允许重复元素。如果您尝试添加一些新元素,它将比较(使用Equals方法)已在集合中的每个元素与您添加的元素

NHibernate映射文件中的列表、集合和包之间有什么区别?每个元素与.NET集合的关系如何?

主要的区别在于列表对元素有一个隐式的排序,按元素在列表中的位置进行索引。成套设备和行李也可以“订购”,通常由比较器或order by子句进行订购,当这些项目从DB中出来时,将应用该子句。就我个人而言,我从来没有用过包。。。如果我知道我想要的数据是按顺序排列的,我就使用列表,否则我就使用集合。

集合不允许重复元素。如果您尝试添加一些新元素,它将比较(使用Equals方法)已在集合中的每个元素与您添加的元素,如果其中一个retuns为true,则不会添加元素

NHibernate中的所有这些对象与这些抽象数据类型(ADT)的其他实现完全相同。我很惊讶在网上找到套装和包是多么困难,因为其他东西的名字是多么常见,所以我在这里列出了一些链接和描述

有关更多详细信息,请参阅以下内容: , 和

一般规则是:

列表在默认情况下是有序的,如果您希望能够通过索引拉出对象,或者您对
foreach
循环上的
循环有一种奇怪的偏好,请使用这些列表。您不需要像在应用程序中那样按顺序访问它们。此ADT允许复制

请注意!尽管列表是按BryanD在回答中提到的顺序排列的,在执行HQL查询时,绝对没有任何规定必须按照您期望的数据库顺序排列,除非您通过命令指定顺序。正因为如此,一些人喜欢使用Set或Bags,这样就不会产生被命令的错觉。尽管我这么说,但大多数情况下,它们都是以可见的顺序出现的,因为它们是按照在NHibernate运行的查询中找到的顺序添加到列表中的

集合在默认情况下是有序的,您不能通过索引直接访问任何变量。默认情况下,集合是上述三个集合中保持其对象唯一性的唯一ADT。如果您需要不包含重复项的集合,则这些集合非常有用

行李(或多集)是一种集合类型,您可以从上面的链接中看到,它允许其中的对象与其他对象重复。这些通常不使用,因为列表排序可以忽略,因此被视为一个包

关于这些在NHibernate中的使用方式,根据您在此处选择的ADT,从数据库中提取的内容不会有所不同,这是您希望使用它的目的,这应该让您选择不同的ADT

就我个人而言,我对大多数事情都使用集合,因为我通常要求子对象是唯一的,并且排序不是问题。虽然我将使用列表,其中我有一组对象,我希望按某物(例如时间)排序,但为了实现此顺序,我需要在HQL查询中手动设置“排序依据”。

NHibernate语义:

  • 列表:实体的有序集合,允许重复。在代码中使用.NET
    IList
    。索引列需要映射到NHibernate中

  • 集合:唯一实体的无序集合,不允许重复。在代码中使用
    Iesi.Collection.ISet
    (NH在v4之前)或
    System.Collections.Generic.ISet
    (NH v4+)。重写
    GetHashCode
    Equals
    以指示复制的业务定义非常重要。可以通过定义orderby或通过定义比较器进行排序,从而生成
    SortedSet
    结果

  • 包:无序的实体列表,允许重复。在代码中使用.NET
    i集合
    。NHibernate未映射列表的索引列,也不支持该列


  • 更正列表-在NHibernate映射文件中使用列表需要映射索引列。通过这种方式,列表将按照其放入的确切顺序被拉出。@Michael Gattuso说得好,我应该在上面的回答中提到我在谈论HQL查询(因此有“order by”注释)而不是映射文件中的实际收集规范。使用包的一个好处是,在向数据库添加新元素时,不必从数据库中加载包。没有要检查的重复项,没有要确定的顺序。Re:#2,我们不能只使用常规的
    ISet
    而不是
    Iesi
    ?@SergeyTachenov:请参阅以获取可能的答案。当这个答案被写出来的时候,它不是网络的一部分。这个问题最不受欢迎的答案是肯定的,因为NHibernate 4。所以也许这个问题也需要编辑。