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


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(可选,默认值为

posted @ 2012-05-14 09:51  Tammie-锴  阅读(391)  评论(0编辑  收藏  举报