NHibernate配置文件和映射文件的详解

来源:互联网 发布:淘宝不花钱买东西退款 编辑:程序博客网 时间:2024/05/18 10:24

NHibernate配置文件和映射文件的详解

Hibernate-mapping映射文件中不仅描述了NHibernate在运行时需要使用到的元素类型和属性,同时还包含了额外的元素属性,如被映射字段是否允许为空等。映射文件中不仅描述了NHibernate在运行时需要使用到的元素类型和属性,同时还包含了额外的元素属性,如被映射字段是否允许为空等。

NHiberbate的基本构成接口: 

 

ISession
ISession是面向用户的主要接口,主要用于对象持久化,数据加载等操作,支持数据库事务,它隐藏了NHB内部复杂的实现细节,ISessionISessionFactory创建。

ISessionFactory
ISessionFactoryNHB内部的核心类,它维护到持久机制(数据库)的连接并对它们进行管理,同时还会保存所有持久对象的映射信息。
ISessionFactoryConfiguration创建,因为创建ISessionFactory的开销非常大(需要加载映射信息),所以这个对象一般使用Singleton(单例)模式。

ITransaction
ITransactionNHB的事务处理接口,它只是简单的封装了底层的数据库事务。
事务必须由ISession来启动。

ICriteria
ICriteriaExpression(表达式)数据加载接口,Expression是一个关系表达式组合,通过它能产生SQL语句的Where部分用户需要通过ISession来间接调用它。

IQuery
IQueryHQL数据加载接口,HQL(Hibernate Query Language)NHB专用的面向对象的数据查询语言,它与数据库的SQL有些类似,但功能更强大!同ICriteria一样,也需要通过ISession来间接调用它。

 

下面是配置文件和映射文件的详解:

 

NHibernate是通过映射文件,将数据表中的记录转化为对象,将记录中的字段转化为对象的属性,所以说映射文件是O/R映射中至关重要的一个环节,下面就对其进行详细的讲解说明。

  1 <?xml version="1.0" ?>

 2 <hibernate-mapping xmlns="urn:nhibernate-mapping-2.0" namespace="Eg" assembly="Eg">
 3           <class name="Cat" table="CATS" discriminator-value="C">
 4                     <id name="Id" column="uid" type="Int64">
 5 <generator class="hilo"/>
 6                     </id>
 7                     <discriminator column="subclass" type="Char"/>
 8                     <property name="Birthdate" type="Date"/>
 9                     <property name="Color" not-null="true"/>
10                     <property name="Sex" not-null="true" update="false"/>
11                     <property name="Weight"/>
12                     <many-to-one name="Mate" column="mate_id"/>
13                     <set name="Kittens">
14                                <key column="mother_id"/>
15                                <one-to-many class="Cat"/>
16                     </set>
17                     <subclass name="DomesticCat" discriminator-value="D">
18                                <property name="Name" type="String"/>
19                     </subclass>
20           </class>
21           <class name="Dog">
22                     <!-- mapping for Dog could go here -->
23           </class>
24 </hibernate-mapping>

 映射文件中不仅描述了NHibernate在运行时需要使用到的元素类型和属性,同时还包含了额外的元素属性,如被映射字段是否允许为空等。

 

Schema

在NHibernate中所使用的所有映射文件均使用nhibernate-mapping-2.0schema。NHibernate会把这种Schema作为嵌入资源使用。

Hibernate-mapping

 

 1 <hibernate-mapping

2 
3           schema="schemaName" (1)
4           default-cascade="none|save-update" (2)
5           auto-import="true|false" (3)
6           default-access="property|field|nosetter|ClassName" (4)
7           assembly="assembly.name" (5)
8           namespace="namespace.name" (6)
9 >

 

这个元素有六个可选属性。

Schema(可选) :数据表结构名称;

(1)     Default-cascade(可选,默认值为none) :数据表级联类型;

(2)     Auto-import(可选,默认值true) :指示出是否可以在查询语句中不指定类名;

(3)     Default-access(可选,默认值为”property”):指示出NHibernate用于访问字段的策略;

(4)     Assemble(可选):如果在引用实体类时没有指明类名前缀,则用此选项值作为默认的类名前缀;

(5)     Namespace(可选):指示同名称空间;

    如果你有两个同名的被持久化的对象(classname相同),则必须将”auto-import” 选项值设为false,否则当你访问这个对象时NHibernate会抛出一个异常。

Class

 

  1 <class

 2 
 3           name="ClassName" (1)
 4           table="tableName"(2)
 5           discriminator-value="discriminator_value"(3)
 6           mutable="true|false"(4)
 7           schema="owner"(5)
 8           proxy="ProxyInterface"(6)
 9           dynamic-update="true|false"(7)
10           dynamic-insert="true|false"(8)
11           polymorphism="implicit|explicit"(9)
12           where="arbitrary sql where condition"(10)
13           persister="PersisterClass"(11)
14           lazy="true|false"(12)
15 />

  

(1)     name:持久类在.Net中的类型的的全名及其所在程序集;

(2)     table:数据库中的数据表名称;

(3)     discriminator-value(可选,默认值为类名):用于区分单独的子集,使用与多态形式;

(4)     mutable(可选,默认值为true):指定类实例是否易变;

(5)     schema(可选):重新指定hibernate-mapping中的Schema选项值;

(6)     proxy(可选):指定用于实现惰性初始的接口,如果所有属性都被声明为Virtual,则可以将类名指定给此选项;

(7)     dynamic-update(可选,默认值false):指示出NHibernate在运行时产生的Update SQL语句是否仅包含被修改了的字段;

(8)     dynamic-insert:(可选,默认值false):指示出NHibernate在运行时产生的Insert  SQL语句是否仅包含被值不为Null的字段;

(9)     polymorphism(可选,默认值implict):指示出是否需要有确指明查询是否使用多态性;

(10)  where(可选):指定Where SQL语句可以获取这个类类型的对象;

(11)  persister(可选):指定用户自定义的IClassPersister;

(12)  lazy(可选):将此项设为true等同与将它自己的类名赋予给proxy选项。

 

 

Id

被映射的类必须声明一个Id与数据表中的主键相对应。Id其实也是被映射的类的一个属性,与使用Proerpty声明的属性不同的是ID属性值必须是唯一的,通过ID可以将对象转化为数据表中唯一的一条记录,同样也可以将数据表中的记录转化为对象。

1 <id
2           name="propertyName" (1)
3           type="typename" (2)
4           column="column_name" (3)
5           unsaved-value="any|none|null|id_value" (4)
6           access="field|property|nosetter|ClassName"> (5)
7           <generator class="generatorClass"/>
8 </id>   

 

(1)     name(可选):属性的名称;

(2)     type(可选):属性的类型;

(3)     column(可选,默认值和属性名称相同):数据表中的主键字段名称,如果用户定义的属性名称和此字段名称相同,则此选项可忽略不写;

(4)     unsaved-value(可选,默认值为null):为属性指定默认值,当用户创建一个新的实例时,会将该选 项值做为属性默认值;

(5)     access(可选,默认为”property”):NHibernate对属性的访问策略;

 

Generator

此节指定了用于为该持久类实例产生ID属性值的.Net数据类型。如果需要一些参数对产生类实例ID属性值的数据类型进行配置或是初始化工作,可以使用”Param” 子节对其进行定义。

1 <id name="Id" type="Int64" column="uid" unsaved-value="0">

 

2           <generator class="NHibernate.Id.TableHiLoGenerator">
3                     <param name="table">uid_table</param>
4                     <param name="column">next_hi_value_column</param>
5           </generator>
6 </id>

 

 

 

 

所有的ID属性值产生器均实现了Nhibernate.Id.IdentifierGenerator接口。这是一个很简单的接口,一些应用程序会有他们自已专门的ID属性值产生器。尽量这样,NHibernate仍提供了一些内置的ID属性值产生器,下面对其简单说明。

Identity

支持DB2,MySQL,MSSQL Server,Sybase和HpersonicSQL数据库中的自增字段。会产生类型为Int64,Int32或是Int16的整型数值。

 

Sequence

使用DB2,PostgreSQL, Oracle数据库中的序列。会产生类型为Int64,Int32或是Int16的整型数值。

 

Hilo

使用Hi/lo算法有效的产生一个类型为Int64,Int32或是Int16的整型数值。

 

Guid

使用.Net平台下的newSystem.Guid产生一个唯一的序列值。

 

Assigned

让应用程序在将此类持久化到数据库之前,对ID属性指定一个值。

 

Property

利用Property可以将数据表中的字段映射为持久类的属性。

 1 <property

 2 
 3           name="propertyName"(1)
 4           column="column_name"(2)
 5           type="typename"(3)
 6           update="true|false"(4)
 7           insert="true|false"(5)
 8           formula="arbitrary SQL expression"(6)
 9           access="field|property|nosetter|ClassName"(7)
10 />

 

     (1)     name:要映射成的属性名称;

(2)     column(可选,默认和name值相同):数据表中的字段名称;

(3)     type(可选):指定属性类型;

(4)     update(可选,默认值为true):是否将此属性包含到NHibernate产生的UpdateSQL子句中;

(5)     insert(可选,默认值为true):是否将此属性包含到NHibernate产生的InsertSQL子句中;

(6)     formula(可选):用于计算该属性值的一个SQL表达式。计算属性没有在数据表中没有相应的字段与其对应;

(7)     access(可选,默认为”property”):NHibernate对属性的访问策略;