NHibernate3剖析:Mapping篇之集合映射基础(2):Bag映射
系列引入
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/
Bag映射
这节我们介绍Bag映射,一般而言,Domain中的System.Collections.Generic.ICollection<T>集合类型使用Bag来映射。
映射纲要
Bag映射与Set映射一样。有两个部分:集合外键(Collection foreign keys)和集合元素(Collection element)。
集合外键(Collection foreign keys)。通过<key>映射。其column属性命名方式一般採用"集合持有者类名+Id"命名方式。
集合元素(Collection element),即集合中的对象:
- 值类型,其声明周期全然依赖于集合持有者。通过<element>或<composite-element>映射。
- 引用类型,被作为集合持有的状态考虑的。仅仅有两个对象之间的“连接”,具有其自己的生命周期。通过<one-to-many>或<many-to-many>映射。
案例分析
案例一:BagOfElements
Domain定义中,集合元素通常是单一元素(Elements)类型。即.Net基本类型(string、int、double等等)。
//Code Snippets Copyright http://lyj.cnblogs.com/
public class BagOfElements
{
public int Id { get; set; }
public ICollection<string> Elements { get; set; }
}
映射简单写法:
//Code Snippets Copyright http://lyj.cnblogs.com/
<class name="BagOfElements">
<id name="Id" type="Int32">
<generator class="hilo" />
</id>
<bag name="Elements" table="BagOfElementsElements">
<key column="BagOfElementsId" />
<element type="String" />
</bag>
</class>
单一元素类型在NHibernate中使用<element>映射的,我们应该至少指定column和type类型。假设column没指定,NHibernate提供默认列名id。
数据库架构:

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

案例三:BagOfComponentsWithParent
Domain定义中,集合元素通常是组件(Component)类型。这个组件关联了其持有者。
//Code Snippets Copyright http://lyj.cnblogs.com/
public class BagOfComponentsWithParent
{
public int Id { get; set; }
public ICollection<ComponentsWithParent> ComponentsWithParents { get; set; }
} public class ComponentsWithParent
{
public BagOfComponentsWithParent Owner { get; set; }
public string StringProperty { get; set; }
public int IntProperty { get; set; }
}
映射简单写法:
//Code Snippets Copyright http://lyj.cnblogs.com/
<class name="BagOfComponentsWithParent">
<id name="Id" type="Int32">
<generator class="hilo" />
</id>
<bag name="ComponentsWithParents">
<key column="BagOfComponentsWithParentId" />
<composite-element class="ComponentsWithParent">
<parent name="Owner" />
<property name="StringProperty" />
<property name="IntProperty" />
</composite-element>
</bag>
</class>
数据库架构:

案例四:BagOfNestedComponentsWithParent
Domain定义中,集合元素通常是组件(Component)类型,这个组件关联了其持有者而且嵌套了一个组件类型。
//Code Snippets Copyright http://lyj.cnblogs.com/
public class BagOfNestedComponentsWithParent
{
public int Id { get; set; }
public ICollection<NestedComponents> NestedComponents { get; set; }
} public class NestedComponents
{
public BagOfNestedComponentsWithParent Owner { get; set; }
public string StringProperty { get; set; }
public NestedComponentsWithParent NestedComponentsWithParent { get; set; }
} public class NestedComponentsWithParent
{
public NestedComponents OwnerNestedComponent { get; set; }
public int IntProperty { get; set; }
}
映射简单写法:
//Code Snippets Copyright http://lyj.cnblogs.com/
<class name="BagOfNestedComponentsWithParent">
<id name="Id" type="Int32">
<generator class="hilo" />
</id>
<bag name="NestedComponents">
<key column="BagOfNestedComponentsWithParentId" />
<composite-element class="NestedComponents">
<parent name="Owner" />
<property name="StringProperty" />
<nested-composite-element class="NestedComponentsWithParent">
<parent name="OwnerNestedComponent" />
<property name="IntProperty" />
</nested-composite-element>
</composite-element>
</bag>
</class>
数据库架构:

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

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

结语
開始NH剖析的Mapping篇,这篇文章介绍NHibernate中的集合映射之Bag映射。
希望本文对你有所帮助。
NHibernate3剖析:Mapping篇之集合映射基础(2):Bag映射的更多相关文章
- NHibernate3剖析:Mapping篇之集合映射基础(3):List映射
系列引入 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数据操作 ...
随机推荐
- tcpg通信
1.客户端 from socket import * def main(): # 创建套接字 tcp_socket = socket(AF_INET,SOCK_STREAM) # 链接服务端 ip = ...
- 洛谷—— P1629 邮递员送信
https://www.luogu.org/problem/show?pid=1629 题目描述 有一个邮递员要送东西,邮局在节点1.他总共要送N-1样东西,其目的地分别是2~N.由于这个城市的交通比 ...
- 洛谷——P1043 数字游戏
https://www.luogu.org/problem/show?pid=1043 题目描述 丁丁最近沉迷于一个数字游戏之中.这个游戏看似简单,但丁丁在研究了许多天之后却发觉原来在简单的规则下想要 ...
- Cocos2dx 小技巧(十二) 一种可行的系列动画播放方式
今早发生了一件事让我感觉特气愤!去年的这个时候,我和小伙伴们一起在操场上拍毕业照,之后有个当地报纸的记者来我们学校取材,看到我们后打算给我们拍几张创意张扬点的毕业照.之后呢,照片出来了,拍的效果大伙都 ...
- 具体解释Hibernate中的二级缓存
1.前言 这篇博客再前几篇博客的基础上来解说一下.Hibernate中的二级缓存.二级缓存是属于SessionFactory级别的缓存机制. 第一级别的缓存是Session级别的缓存,是属于事务范围的 ...
- Spark MLlib聚类KMeans
算法说明 聚类(Cluster analysis)有时也被翻译为簇类,其核心任务是:将一组目标object划分为若干个簇,每个簇之间的object尽可能相似,簇与簇之间的object尽可能相异.聚类算 ...
- Jenkins学习总结(3)——Jenkins+Maven+Git搭建持续集成和自动化部署的
前言 持续集成这个概念已经成为软件开发的主流,可以更频繁的进行测试,尽早发现问题并提示.自动化部署就更不用说了,可以加快部署速度,并可以有效减少人为操作的失误.之前一直没有把这个做起来,最近的新项目正 ...
- RelativeLayout-属性大全
// 相对于给定ID控件 <!--将该控件的底部置于给定ID的控件之上--> android:layout_above <!--将该控件的底部置于给定ID的控件之下--> an ...
- Android学习笔记进阶15之Shader渲染
Android提供的Shader类主要是渲染图像以及一些几何图形. Shader有几个直接子类: BitmapShader : 主要用来渲染图像 LinearGradient :用来进行线性渲 ...
- 阿姆达尔定律(Amdahl's law)
首先给出阿姆达尔定律的数学公式描述: S(N)=1(1−p)+pN p:程序中可并行部分的程序在单核上执行时间的占比: N:处理器的数目(总的核心数) S(N):程序在 N 个处理器(总核心数)相对在 ...