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 |
四者的差别就在上面,可以根据实际情况,进行选用。
转自:
http://www.cnblogs.com/kissdodog/archive/2013/03/04/2943097.html
NHibernate 集合映射深入 (第五篇) <set>,<list>,<map>,<bag>的更多相关文章
- NHibernate 集合映射基础(第四篇) - 一对一、 一对多、多对多小示例
映射文件,用于告诉NHibernate数据库里的表.列于.Net程序中的类的关系.因此映射文件的配置非常重要. 一.一对一 NHibernate一对一关系的配置方式使用<one-to-one&g ...
- NHibernate 继承映射(第十六篇)
在NHibernate的映射中,关于继承的映射策略有3种方式 单表继承 类表继承 具体表继承 另外还有一种比较特别的多态映射 隐式多态 下面分别来阐述NHibernate继承映射的各种策略要点. 一. ...
- Hibernate的集合映射(Set、List、Array、Map、Bag)
POJOs如下: Customer类------>customer表 Order类对应---------->orders表 customer(1)<-------------- ...
- NHibernate 之数据操作 (第五篇)
数据操作,在这里主要介绍INSERT.UPDATE.DELETE.我们在使用NHibernate的时候,如果只是查询数据,不需要改变数据库的值,那么是不需要提交或者回滚到数据库的. 一.INSERT ...
- 集合映射中的映射包(使用xml文件)
如果持久类有List对象,我们可以通过列表或者bag元素在映射文件中映射. 这个包(bag)就像List一样,但它不需要索引元素. 在这里,我们使用论坛的场景: 论坛中一个问题有多个答案. 我们来看看 ...
- NHibernate3剖析:Mapping篇之集合映射基础(2):Bag映射
系列引入 NHibernate3.0剖析系列分别从Configuration篇.Mapping篇.Query篇.Session策略篇.应用篇等方面全面揭示NHibernate3.0新特性和应用及其各种 ...
- NHibernate3剖析:Mapping篇之集合映射基础(3):List映射
系列引入 NHibernate3.0剖析系列分别从Configuration篇.Mapping篇.Query篇.Session策略篇.应用篇等方面全面揭示NHibernate3.0新特性和应用及其各种 ...
- NHibernate 映射基础(第三篇) 简单映射、联合主键
NHibernate 映射基础(第三篇) 简单映射.联合主键 NHibernate完全靠配置文件获取其所需的一切信息,其中映射文件,是其获取数据库与C#程序关系的所有信息来源. 一.简单映射 下面先来 ...
- Hibernate第四篇【集合映射、一对多和多对一】
前言 前面的我们使用的是一个表的操作,但我们实际的开发中不可能只使用一个表的-因此,本博文主要讲解关联映射 集合映射 需求分析:当用户购买商品,用户可能有多个地址. 数据库表 我们一般如下图一样设计数 ...
随机推荐
- Android——事务
一.什么是事务 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消.也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做. 事务的结 ...
- windows 下 MySql5.6主从复制
说明: 1.MySql 版本5.6 2.本例中使用的主从服务器ip分别为:192.168.120.211:192.168.120.209 一.配置master服务器 1.配置 在my.ini中[mys ...
- C# 不借助第三个变量实现两整数交换
c#中实现两个int变量的数值互换,在借助第三个变量做临时载体的情况下,非常简单. ; ; int c ; c = a; a = b; b = c; 如果不借助第三方变量,有几种实现的方法: 1.异或 ...
- 通过ambari安装hadoop集群(二)
开始安装,输入主机名字,然后选择私钥 注意java_home那里需要改为/usr/jdk64/jdk1.6.0_31,然后点击确认,它会出一个警告提示,别管他就行. 等待安装完毕之后,就会出现成功的提 ...
- Git 克隆操作
我们有一个裸库Git服务器,Tom 也推了他的第一个版本.现在,Jerry 可以查看他的变化.克隆操作的远程存储库创建实例. Jerry 在他的home目录,并创建新的目录,执行克隆操作. [jerr ...
- 【IntelliJ IDEA】idea上提交代码到GitHub,已经提交了 但是GitHub上却没有的解决办法
摘要: 今天提交idea上的代码到GitHub,提交过程已经完成, 在版本控制的Log中可以看到,已经将这一部分都提交更新了 在版本控制的Local Changes中已经看不到提交过的代码了 ...
- 使用VMware将Linux装在物理硬盘上,开机即可进入Linux
我的笔记本上是双系统Windows和Linux .经常需要在两个系统间切换,很麻烦.于是我想到如果能用VMWare虚拟机加载物理硬盘中的系统,可以在需要时,直接启动另外一个系统. 注意:我的双 ...
- 关于Unity中网格导航与寻路
寻路思路 1.烘焙出地形数据,导航数据,区分哪些是路径,哪些是障碍物 2.给要寻路的角色添加寻路的组件,加好了以后就会有速度和目的地之类的参数设置 3.只要设置好目的地,角色就会根据烘焙好的地图自己走 ...
- 1、Maven安装教程详解
一.准备工作 1.确定电脑上已经成功安装jdk7.0以上版本 2.win10操作系统 3.maven安装包 下载 ...
- (笔记)Linux Root下的.gvfs出现异常解决办法
在linux系统下安装软件或复制文件的时候,复制不成功,出现错误如下: error: failed to stat /home/dade/.gvfs: Permission denied. 表面上看: ...