NHibernate3剖析:Mapping篇之集合映射基础(3):List映射
系列引入
NHibernate3.0剖析系列分别从Configuration篇、Mapping篇、Query篇、Session策略篇、应用篇等方面全面揭示NHibernate3.0新特性和应用及其各种应用程序的集成,基于NHibernte3.0版本号。
假设你还不熟悉NHibernate。能够高速阅读NHibernate之旅系列文章导航系列入门,假设你已经在用NHibernate了,那么请跟上NHibernate3.0剖析系列吧。
- NHibernate专题:http://kb.cnblogs.com/zt/nhibernate/
- NHibernate官方网站:http://nhforge.org/
- NHibernate參考文档:http://nhforge.org/doc/nh/en/
- 获取NHibernate地址:http://sourceforge.net/projects/nhibernate/
List映射
这节我们介绍List映射,一般而言,Domain中的System.Collections.Generic.IList<T>集合类型使用List来映射。
映射纲要
List映射有三个部分:集合外键(Collection foreign keys)、索引字段(index column)、集合元素(Collection element)。
集合外键(Collection foreign keys),通过<key>映射。其column属性命名方式一般採用"集合持有者类名+Id"命名方式。
索引字段(index column),用于相应数组或List的索引,是Int类型。有顺序排列的整数(默认base为0,字段名称为idx)。
通过<list-index>映射。
集合元素(Collection element),即集合中的对象:
- 值类型。其声明周期全然依赖于集合持有者。通过<element>或<composite-element>映射。
- 引用类型,被作为集合持有的状态考虑的。仅仅有两个对象之间的“连接”。具有其自己的生命周期。通过<one-to-many>或<many-to-many>映射。
案例分析
案例一:ListOfElements
Domain定义中,集合元素通常是单一元素(Elements)类型,即.Net基本类型(string、int、double等等)。
//Code Snippets Copyright http://lyj.cnblogs.com/
public class ListOfElements
{
public int Id { get; list; }
public IList<string> Elements { get; list; }
}
映射简单写法:
//Code Snippets Copyright http://lyj.cnblogs.com/
<class name="ListOfElements">
<id name="Id" type="Int32">
<generator class="hilo" />
</id>
<list name="Elements" table="ListOfElementsElements">
<key column="ListOfElementsId" />
<list-index />
<element type="String" />
</list>
</class>
单一元素类型在NHibernate中使用<element>映射的,我们应该至少指定column和type类型,假设column没指定,NHibernate提供默认列名id。
数据库架构:

案例二:ListOfComponents
Domain定义中,集合元素通常是组件(Component)类型,也就是值类型。
//Code Snippets Copyright http://lyj.cnblogs.com/
public class ListOfComponents
{
public int Id { get; list; }
public IList<ComponentList> Components { get; list; }
}
public class ComponentList
{
public string StringProperty { get; list; }
public int IntProperty { get; list; }
}
映射简单写法:
//Code Snippets Copyright http://lyj.cnblogs.com/
<class name="ListOfComponents">
<id name="Id" type="Int32">
<generator class="hilo" />
</id>
<list name="Components">
<key column="ListOfComponentsId" />
<list-index />
<composite-element class="ComponentList">
<property name="StringProperty" />
<property name="IntProperty" />
</composite-element>
</list>
</class>
组件(Component)类型使用composite-element映射,须要指明组件类名。然后映射其组件属性。
数据库架构:

案例三:ListOfOneToMany
Domain定义中。集合元素是指向还有一个实体OneToManyList的引用。
这里设置为一对多关系。
//Code Snippets Copyright http://lyj.cnblogs.com/
public class ListOfOneToMany
{
public int Id { get; list; }
public IList<OneToManyList> OneToMany { get; list; }
}
public class OneToManyList
{
public int Id { get; list; }
}
映射简单写法:
//Code Snippets Copyright http://lyj.cnblogs.com/
<class name="ListOfOneToMany">
<id name="Id" type="Int32">
<generator class="hilo" />
</id>
<list name="OneToMany">
<key column="ListOfOneToManyId" />
<list-index />
<one-to-many class="OneToManyList" />
</list>
</class>
<class name="OneToManyList">
<id name="Id" type="Int32">
<generator class="hilo" />
</id>
<property name="Name" />
</class>
我们为ListOfOneToMany和OneToManyList定义一对多关系。使用<one-to-many>映射,指明关联的对象。
数据库架构:

案例四:ListOfManyToMany
Domain定义中,集合元素是指向还有一个实体ManyToManyList的引用。
这里设置为多对多关系。
//Code Snippets Copyright http://lyj.cnblogs.com/
public class ListOfManyToMany
{
public int Id { get; list; }
public IList<ManyToManyList> ManyToMany { get; list; }
}
public class ManyToManyList
{
public int Id { get; list; }
}
映射简单写法:
//Code Snippets Copyright http://lyj.cnblogs.com/
<class name="ListOfManyToMany">
<id name="Id" type="Int32">
<generator class="hilo" />
</id>
<list name="ManyToMany" table="ListOfManyToManyToManyToManyList">
<key column="ListOfManyToManyId" />
<list-index />
<many-to-many class="ManyToManyList" column="ManyToManyListId" />
</list>
</class>
<class name="ManyToManyList">
<id name="Id" type="Int32">
<generator class="hilo" />
</id>
</class>
两个对象的多对多关系。须要一个“中间表”来存储这两个对象的关系。
数据库架构:

结语
開始NH剖析的Mapping篇。这篇文章介绍NHibernate中的集合映射之List映射。
希望本文对你有所帮助。
NHibernate3剖析:Mapping篇之集合映射基础(3):List映射的更多相关文章
- NHibernate3剖析:Mapping篇之集合映射基础(2):Bag映射
系列引入 NHibernate3.0剖析系列分别从Configuration篇.Mapping篇.Query篇.Session策略篇.应用篇等方面全面揭示NHibernate3.0新特性和应用及其各种 ...
- NHibernate3剖析:Query篇之NHibernate.Linq增强查询
系列引入 NHibernate3.0剖析系列分别从Configuration篇.Mapping篇.Query篇.Session策略篇.应用篇等方面全面揭示NHibernate3.0新特性和应用及其各种 ...
- NHibernate剖析:Mapping篇之Mapping-By-Code(1):概览
ModelMapper概述 NHibernate3.2版本号集成Mapping-By-Code(代码映射),其设计思想来源于ConfORM.代码总体构思基于"Loquacious" ...
- Hibernate第四篇【集合映射、一对多和多对一】
前言 前面的我们使用的是一个表的操作,但我们实际的开发中不可能只使用一个表的-因此,本博文主要讲解关联映射 集合映射 需求分析:当用户购买商品,用户可能有多个地址. 数据库表 我们一般如下图一样设计数 ...
- NHibernate 映射基础(第三篇) 简单映射、联合主键
NHibernate 映射基础(第三篇) 简单映射.联合主键 NHibernate完全靠配置文件获取其所需的一切信息,其中映射文件,是其获取数据库与C#程序关系的所有信息来源. 一.简单映射 下面先来 ...
- Python基础篇(set集合)
Python基础篇(set集合,深浅拷贝) set集合是Python的一个基本类型,一般是不常用.set中的元素是不重复的.无序的里边 的元素必须是可hash的比如int,str,tuple,bool ...
- 第二十七篇 玩转数据结构——集合(Set)与映射(Map)
1.. 集合的应用 集合可以用来去重 集合可以用于进行客户的统计 集合可以用于文本词汇量的统计 2.. 集合的实现 定义集合的接口 Set<E> ·void add(E) ...
- Pyhton开发【第五篇】:Python基础之杂货铺
Python开发[第五篇]:Python基础之杂货铺 字符串格式化 Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进 ...
- Hadoop生态圈-Hive快速入门篇之HQL的基础语法
Hadoop生态圈-Hive快速入门篇之HQL的基础语法 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客的重点是介绍Hive中常见的数据类型,DDL数据定义,DML数据操作 ...
随机推荐
- mac下安装配置java开发环境
可以使用homebrew下载相关软件,以下具体讲一下环境的配置: mac下安装jdk vi .bash_profile 输入i,进入编辑模式 输入以下配置,其中JAVA_HOME是你的jdk安装目录 ...
- [Preference] How to avoid Forced Synchronous Layout or FSL to improve site preference
When tigger site updates the layout, it always follow this order: Javascript trigger style changes, ...
- Hadoop高速入门
Hadoop高速入门 先决条件 支持平台 GNU/Linux是产品开发和执行的平台. Hadoop已在有2000个节点的GNU/Linux主机组成的集群系统上得到验证. Win32平台是作为开发平台支 ...
- DirectX11 学习笔记1 - 第一个程序
为了加快学习速度,和使程序更加easy理解. 我把sampler tutorial里面的一个样例 的固定代码和常常修改的代码经过简单的类的封装了一下. 以后学习的时候就能够仅仅在还有一个文件写ren ...
- Android Cocos2dx引擎 prv.ccz/plist/so等优化缓存文件,手把手ida教你逆向project反编译apk库等文件
前段时间在 Android play 上看到一个非常牛逼的 3D 动态天气预报,效果真的非常炫.二话不说动手 dex2jar.bat/apktool 发现这并没 有什么卵用,在核心的地方看见 nati ...
- Spork: Pig on Spark实现分析
介绍 Spork是Pig on Spark的highly experimental版本号,依赖的版本号也比較久,如之前文章里所说.眼下我把Spork维护在自己的github上:flare-spork. ...
- [Phonegap+Sencha Touch] 移动开发19 某些安卓手机上弹出消息框 点击后不消失的解决的方法
Ext.Msg.alert等弹出框在某些安卓手机上,点击确定后不消失. 原因是: 消息框点击确定后有一段css3 transform动画,动画完毕后才会隐藏(display:none). 有些奇葩手机 ...
- Android App 内存泄露之Thread
Thread 内存泄露 线程也是造成内存泄露的一个重要的源头.线程产生内存泄露的主要原因在于线程生命周期的不可控. 1.看一下以下是否存在问题 <span style="white-s ...
- Fragment状态保存
这篇博文是对官方API Demo的FragmentRetainInstanceSupport.java的学习.路径在android-sdk-macosx/extras/android/support/ ...
- 一个JavaWeb项目中使用的部分技术
-- 2015年8月8日 1. Web框架: Spring+ SpringMVC + MyBatis Spring: 作为容器.工厂,用于解耦以及管理对象生命周期. 整合各类框架和依赖. MVC : ...