一、集合外键

  在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

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

转自:

http://www.cnblogs.com/kissdodog/archive/2013/03/04/2943097.html

NHibernate 集合映射深入 (第五篇) <set>,<list>,<map>,<bag>的更多相关文章

  1. NHibernate 集合映射基础(第四篇) - 一对一、 一对多、多对多小示例

    映射文件,用于告诉NHibernate数据库里的表.列于.Net程序中的类的关系.因此映射文件的配置非常重要. 一.一对一 NHibernate一对一关系的配置方式使用<one-to-one&g ...

  2. NHibernate 继承映射(第十六篇)

    在NHibernate的映射中,关于继承的映射策略有3种方式 单表继承 类表继承 具体表继承 另外还有一种比较特别的多态映射 隐式多态 下面分别来阐述NHibernate继承映射的各种策略要点. 一. ...

  3. Hibernate的集合映射(Set、List、Array、Map、Bag)

    POJOs如下: Customer类------>customer表   Order类对应---------->orders表  customer(1)<-------------- ...

  4. NHibernate 之数据操作 (第五篇)

    数据操作,在这里主要介绍INSERT.UPDATE.DELETE.我们在使用NHibernate的时候,如果只是查询数据,不需要改变数据库的值,那么是不需要提交或者回滚到数据库的. 一.INSERT ...

  5. 集合映射中的映射包(使用xml文件)

    如果持久类有List对象,我们可以通过列表或者bag元素在映射文件中映射. 这个包(bag)就像List一样,但它不需要索引元素. 在这里,我们使用论坛的场景: 论坛中一个问题有多个答案. 我们来看看 ...

  6. NHibernate3剖析:Mapping篇之集合映射基础(2):Bag映射

    系列引入 NHibernate3.0剖析系列分别从Configuration篇.Mapping篇.Query篇.Session策略篇.应用篇等方面全面揭示NHibernate3.0新特性和应用及其各种 ...

  7. NHibernate3剖析:Mapping篇之集合映射基础(3):List映射

    系列引入 NHibernate3.0剖析系列分别从Configuration篇.Mapping篇.Query篇.Session策略篇.应用篇等方面全面揭示NHibernate3.0新特性和应用及其各种 ...

  8. NHibernate 映射基础(第三篇) 简单映射、联合主键

    NHibernate 映射基础(第三篇) 简单映射.联合主键 NHibernate完全靠配置文件获取其所需的一切信息,其中映射文件,是其获取数据库与C#程序关系的所有信息来源. 一.简单映射 下面先来 ...

  9. Hibernate第四篇【集合映射、一对多和多对一】

    前言 前面的我们使用的是一个表的操作,但我们实际的开发中不可能只使用一个表的-因此,本博文主要讲解关联映射 集合映射 需求分析:当用户购买商品,用户可能有多个地址. 数据库表 我们一般如下图一样设计数 ...

随机推荐

  1. 首部讲Python爬虫电子书 Web Scraping with Python

    首部python爬虫的电子书2015.6pdf<web scraping with python> http://pan.baidu.com/s/1jGL625g 可直接下载 waterm ...

  2. 纯css控制文字2行显示多余部分隐藏

    在编写页面的时候,经常遇到一些地方的文字显示1行,多余的文字隐藏,这样显示1行的很好控制: css代码如下: white-space: nowrap; overflow: hidden; text-o ...

  3. Java知多少(17)强调一下编程风格

    讲完了Java的基础语法,大家就可以编写简单的程序代码了,这里有必要强调一下编程风格. 代码风格虽然不影响程序的运行,但对程序的可读性却非常重要.自己编写的程序要让别人看懂,首先在排版方面要非常注意. ...

  4. Java设计模式(18)策略模式(Strategy模式)

    Strategy是属于设计模式中 对象行为型模式,主要是定义一系列的算法,把这些算法一个个封装成单独的类. Stratrgy应用比较广泛,比如,公司经营业务变化图,可能有两种实现方式,一个是线条曲线, ...

  5. Androidn Notification的使用,解决找不到setLatestEventInfo方法

    转自:http://blog.csdn.net/songyachao/article/details/51245370#comments 今天使用4.0.3使用 Notification notifi ...

  6. CSS非ASCII字符最佳实践

    问题场景 在写样式时经常需要用到非ASCII字符的属性值,如下: ? 1 2 3 4 5 6 7 8 9 10 11 .hot_list .sign_discount:before {    cont ...

  7. C# 中委托和代理是一个概念吗??

    刚刚看了一下资料,发现有些资料说的是代理,有的说是委托,但都是指同一样东西delegate,委托和事件是有关的,因为事件的本质就是多播委托,关于多播委托楼主可以找找资料就知道了. 不过个人觉得这两个概 ...

  8. Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.【转】

    今天碰到了一个查询异常问题,上网查了一下,感谢原创和译者 如果你使用的数据库连接类是 the Data Access Application Blocks "SqlHelper" ...

  9. memcached -- 运行memcached

    Memcached 运行 Memcached命令的运行: $ /usr/local/memcached/bin/memcached -h 注意:如果使用自动安装, memcached 命令位于 /us ...

  10. bioerl 获取gi号

    代码示例: use Bio::DB::EUtilities; my @ids = qw(CAB02640 EAS10332 YP_250808 NP_623143 P41007); my $facto ...