zoukankan      html  css  js  c++  java
  • NHibernate 集合映射深入 (第五篇) <set>,<list>,<map>,<bag>

    一、集合外键

      在NHibernate中,典型的用于映射集合类的元素有<set>,<list>,<map>,<bag>,<array>,<primitive-array>。

      我们回到上一篇,集合映射基础当中的一对多查询。对于集合类型:

     public virtual ISet<PersonModel> ListPerson { get;  set; }

      NHibernate的配置文件与之对应的是:

        <set name="ListPerson" table="Person" generic="true" inverse="true">
          <key column="CountryId" foreign-key="FK_Person_Country"/> <!-- Person的拥有者 外键列名 -->
          <one-to-many class="Model.PersonModel,Model"/>
        </set>

      那么<set>、<list>、<map>、<bag>、<array>、<primitive-array>这些东西的用法以及它们之间的区别是什么呢?

      1.<set>

      ISet<Model>集合中的对象是唯一的,无序的,不能通过索引、key值访问。
      在.Net中并没有与<set>对应的类。因此当我们的配置文件是<set>配置集合关系的时候,Model持久化类中ISet<Model>必须使用NHibernate的Iesi.Collections的。 

      2.<bag>
      <bag>跟<set>基本一样,唯一不同之处在于bag中允许重复对象。
      与<bag>配置对应的集合类型是IList<Model>。

      3.<list>
      有序集合,可以重复,使用从0开始的整数作为索引。因此,在配置<list>节点的时候必须要有<index>,并且index指定的列类型必须为整型。
      与<list>配置对应的集合类型是IList<Model>。

      4.<map>
      无序集合,key值不能重复,值可以重复,可以使用任意类型的对象作为索引。
      与<map>配置对应的集合类型是IDictionary<key,value>。

      首先我们根据数据之间的关系,从<set>, <bag>, <list>, <map>中选择合适的映射配置节点。下表是配置节点与接口类型对应关系:

      对应的集合属性必须使用接口声明,因为 NHibernate返回的集合对象类型,是它内部对这些接口的实现,即NHibernate.Collection命名空间下的 PersistentSet、PersistentList、PersistentBag、PersistentMap,而不是ListSet、 HashTable等。按照NHibernate的规定使用这些接口的具体类,NHibernate在存取时能够自动转换处理。

      .Net中没有set和bag的实现,所以NHibernate使用Iesi.Collections的set,使用IList模拟bag语义。

      如果属性不希望使用这些接口,可以使用access。将field设置为接口类型,在property的get, set方法中完成类型转换,通过属性配置中的access设置,让NHibernate绕开get, set方法直接存取field。

    <list name="Addresses" table="USER_ADDRESS">
        <key column="USER_ID"/>
        <index column="ADDR_INDEX"/>
        <element column="ADDRESS" type="String"/>
    </list>

       <map>与<list>的区别在 于,<list>的index是整型,而<map>的index可以为任意类型,所以<map>中 的<index>节点可以指定type属性。有的情况下,可能通过关联使用其它实体作为index,因此NHibernate 为<map>提供了另外一种index配置方式,<index-many-to-many>和<index-many- to-any>。其它配置跟<set>一样。

      set bag list map
    是否允许重复 key不能重复,值可以重复
    显式排序
    对一个类型 Iesi.Collections.ISet IList IList IDictionary

      四者的差别就在上面,可以根据实际情况,进行选用。

  • 相关阅读:
    基于Metaweblog API 接口一键发布到国内外主流博客平台
    uva144 Student Grants
    Uva 10452
    Uva 439 Knight Moves
    Uva 352 The Seasonal War
    switch语句
    java——基础知识
    我的lua学习2
    codeforces 431 D. Random Task 组合数学
    codeforces 285 D. Permutation Sum 状压 dfs打表
  • 原文地址:https://www.cnblogs.com/liuguanghai/p/5031905.html
Copyright © 2011-2022 走看看