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

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

NHiberbate的基本构成接口: 

 

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

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

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

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

IQuery
IQuery是HQL数据加载接口,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.0 schemaNHibernate会把这种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

支持DB2MySQLMS SQL ServerSybaseHpersonicSQL数据库中的自增字段。会产生类型为Int64Int32或是Int16的整型数值。

 

Sequence

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

 

Hilo

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

 

Guid

使用.Net平台下的new System.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产生的Update SQL子句中;

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

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

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

 

你可能感兴趣的:(Hibernate)