2009-12-16 21 views

回答

213

NHibernate的語義:

  1. 列表:有序實體收集,複製允許的。在代碼中使用.NET IList。索引列需要在NHibernate中映射。

  2. 設置:唯一實體的無序集合,不允許重複。代碼中使用Iesi.Collection.ISet(v4之前的NH)或System.Collections.Generic.ISet(NH v4 +)。重寫GetHashCodeEquals以指示重複的業務定義。可以通過定義一個orderby或通過定義一個導致SortedSet結果的比較器來排序。

  3. Bag:無序的實體列表,允許重複。在代碼中使用.NET ICollection<T>。該列表的索引列未被映射,並且不被NHibernate支持。

+16

3.應該是ICollection 代碼否? – Firo 2011-11-24 08:59:40

+0

Re:#2,我們不能只用常規的'ISet'而不是'Iesi'嗎? – 2016-07-25 19:42:06

+0

@SergeyTachenov:有關可能的答案,請參閱http://stackoverflow.com/questions/9222058/can-net-4-iset-hashset-replace-nhibernate-iesi-collections-iset-hashset。當寫這個答案ISet不是.net的一部分.net – 2016-07-25 19:46:43

1

那麼主要的區別是列表有一個隱含的排序順序元素,由它們在列表中的位置索引。套件和行李通常也可以通過Comparator或order by子句進行「訂購」,當這些物品從數據庫中出來時可以應用。就我個人而言,我從來沒有使用過袋子......如果我知道我想要的數據是按順序排列的,那麼我使用List,否則我使用Set。

0

設置不允許您在其中重複元素。如果您嘗試添加一些新元素,則會比較(使用等於方法)已添加的每個元素,並且如果一個元素回退爲true,則不會添加元素

19

所有NHibernate中的這些對象與這些抽象數據類型(ADT)的其他實現完全相同。我很驚訝在網上找到套裝和手袋有多困難,因爲這些名字對於其他事物的共同點很常見,所以我在這裏列出了一些鏈接和描述。

如需更詳細的信息,看看下面的例子: ListsSetsBags

的一般規則是:

列表默認情況下下令,如果你想用這些能夠通過其索引拉出一個對象,或者對foreach循環有一個奇怪的喜歡for循環。您不需要按照您在Linked List需要的順序訪問它們。這個ADT允許重複。

請注意!儘管列表按照BryanD在答案中提到的順序排列,但完全沒有任何說法指出,除非您通過命令指定命令,否則執行HQL查詢時必須按照您對數據庫的預期順序排列。正因爲如此,有些人喜歡用Set或Bags來代替,所以它不會給人以命令的幻覺。雖然我這樣說,但大多數時候它們看起來都是按照可見的順序排列的,因爲它們是按NHibernate運行的查詢中的順序添加到列表中的。

集合不是默認情況下,你不能直接通過索引訪問任何變量。在默認情況下,僅在上述三個中保留ADT,其保持對象的唯一性。如果你有一個集合,如果你不需要包含重複的東西,這些都很棒。

(或多重集)是,如可以從上面的鏈接看到,類型集,其確實允許在其內的對象是其他對象的副本。這些通常不被使用,因爲列表排序可以被忽略,因此被當作一個Bag。

關於如何在NHibernate中使用這些數據,根據您在此處選擇的ADT,沒有任何數據從數據庫中被取出,這是您希望使用它的原因,因爲這會讓您選擇不同的ADT。

就個人而言,我使用集合的大多數事情,因爲我通常要求子對象是唯一的,並且排序不是問題。雖然我會使用列表,我有一組對象,我想按某種東西排序,例如時間,爲了達到這個順序,我需要在HQL查詢中手動設置「order by」。

+2

更正列表 - 使用NHibernate映射文件中的列表將需要映射索引列。這樣,列表將按照它的確切順序被提取出來。 – 2009-12-17 13:06:01

+0

@Michael Gattuso好的一點,我應該在上面的答案中提到我正在討論HQL查詢(因此'order by'評論)而不是映射文件中的實際集合規範。 – Jay 2009-12-17 20:34:59

+0

使用包的一個好處是,當你添加新的元素時,它們不必從數據庫中加載。沒有重複檢查,無法確定。 – tvaananen 2014-10-03 14:13:50

相關問題