NHibernate 集合映射深入 (第五篇) <set>,<list>,<map>,<bag>

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

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

时间: 2024-10-12 13:02:21

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

NHibernate 之数据操作 (第五篇)

NHibernate 之数据操作 (第五篇) 数据操作,在这里主要介绍INSERT.UPDATE.DELETE.我们在使用NHibernate的时候,如果只是查询数据,不需要改变数据库的值,那么是不需要提交或者回滚到数据库的. 一.INSERT 通过调用ISession.Save()方法,然后同步同步到数据库. Program.cs class Program { static void Main(string[] args) { ISessionFactory sessionFactory =

NHibernate 继承映射(第十六篇)

在NHibernate的映射中,关于继承的映射策略有3种方式 单表继承 类表继承 具体表继承 另外还有一种比较特别的多态映射 隐式多态 下面分别来阐述NHibernate继承映射的各种策略要点. 一.单表继承 单表继承的方式是,所有的字段都放在一个表中,用一个字段来区分子类.使用配置节点<subclass>配置子类. 看DEMO,首先新建一张Animal表如下: 映射文件:Animal.hbm.xml: <?xml version="1.0" encoding=&qu

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

POJOs如下: Customer类------>customer表   Order类对应---------->orders表  customer(1)<--------------->(n)order public class Customer { private String id; private String username; private String password; private Timestamp registerTime; private int age;

NHibernate 过滤器(第十五篇)

NHibernate 过滤器(第十五篇) NHibernate过滤器相当于定义一个非常类似于类和集合上使用的where子句.ISession 中默认是不启用过滤器的,必须通过ISession.EnableFilter()方法显式的启用. 该方法返回被启用的IFilter的实例.这也支持链式操作. 过滤器主要的配置都在映射文件内完成.来看示例: <?xml version="1.0" encoding="utf-8" ?> <hibernate-ma

NHibernate3剖析:Mapping篇之集合映射基础(4):Map映射

系列引入 NHibernate3.0剖析系列分别从Configuration篇.Mapping篇.Query篇.Session策略篇.应用篇等方面全面揭示NHibernate3.0新特性和应用及其各种应用程序的集成,基于NHibernte3.0版本.如果你还不熟悉NHibernate,可以快速阅读NHibernate之旅系列文章导航系列入门,如果你已经在用NHibernate了,那么请跟上NHibernate3.0剖析系列吧. NHibernate专题:http://kb.cnblogs.com

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

系列引入 NHibernate3.0剖析系列分别从Configuration篇.Mapping篇.Query篇.Session策略篇.应用篇等方面全面揭示NHibernate3.0新特性和应用及其各种应用程序的集成,基于NHibernte3.0版本.如果你还不熟悉NHibernate,可以快速阅读NHibernate之旅系列文章导航系列入门,如果你已经在用NHibernate了,那么请跟上NHibernate3.0剖析系列吧. NHibernate专题:http://kb.cnblogs.com

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

系列引入 NHibernate3.0剖析系列分别从Configuration篇.Mapping篇.Query篇.Session策略篇.应用篇等方面全面揭示NHibernate3.0新特性和应用及其各种应用程序的集成,基于NHibernte3.0版本号. 假设你还不熟悉NHibernate.能够高速阅读NHibernate之旅系列文章导航系列入门,假设你已经在用NHibernate了,那么请跟上NHibernate3.0剖析系列吧. NHibernate专题:http://kb.cnblogs.c

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

NHibernate 映射基础(第三篇) 简单映射.联合主键 NHibernate完全靠配置文件获取其所需的一切信息,其中映射文件,是其获取数据库与C#程序关系的所有信息来源. 一.简单映射 下面先来一个简单的例子,然后随着不断地对这个例子修修改改,从而真正了解映射文件.具体的资料可以查看http://www.cnblogs.com/kissdodog/archive/2013/02/21/2919886.html 先来看一张表: 映射文件Product.hbm.xml: <?xml versi

浅析Hibernate映射(五)——集合映射

集合映射主要包括:set.list.array.map的映射 对象模型: 映射后的关系模型: 映射文件: [html] view plaincopyprint? <hibernate-mapping> <class name="com.jialin.hibernate.CollectionMapping" table="t_collection_mapping"> <id name="id"> <gene