NHibernate中的映射文件详解
NHibernate是通过映射文件,将数据表中的记录转化为对象,将记录中的字段转化为对象的属性,所以说映射文件是O/R映射中至关重要的一个环节,下面就对其进行详细的讲解说明。
NHibernate中的映射文件其实质是一个XML文档。可用使用任何的文本编辑器对其进行编辑操作。
<?xml version="1.0" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0"
namespace="Eg" assembly="Eg">
<class name="Cat" table="CATS" discriminator-value="C">
<id name="Id" column="uid" type="Int64">
<generator class="identity"/>
</id>
<discriminator column="subclass" type="Char"/>
<property name="Birthdate" type="Date"/>
<property name="Color" not-null="true"/>
<property name="Sex" not-null="true" update="false"/>
<property name="Weight"/>
<many-to-one name="Mate" column="mate_id"/>
<set name="Kittens">
<key column="mother_id"/>
<one-to-many class="Cat"/>
</set>
<subclass name="DomesticCat" discriminator-value="D">
<property name="Name" type="String"/>
</subclass>
</class>
<class name="Dog">
<!-- mapping for Dog could go here -->
</class>
</hibernate-mapping>
映射文件中不仅描述了NHibernate在运行时需要使用到的元素类型和属性,同时还包含了额外的元素属性,如被映射字段是否允许为空等。
Schema
在NHibernate中所使用的所有映射文件均使用nhibernate-mapping-2.0 schema。NHibernate会把这种Schema作为嵌入资源使用。
Hibernate-mapping
<hibernate-mapping
schema="schemaName" (1=""
default-cascade="none|save-update" (2=""
auto-import="true|false" (3=""
default-access="property|field|nosetter|ClassName" (4=""
assembly="assembly.name" (5=""
namespace="namespace.name" (6="")
>
这个元素有六个可选属性。
·Schema(可选) :数据表结构名称;
·Default-cascade(可选,默认值为none) :数据表级联类型;
·Auto-import(可选,默认值true) :指示出是否可以在查询语句中不指定类名;
·Default-access(可选,默认值为”property”):指示出NHibernate用于访问字段的策略;
·Assemble(可选):如果在引用实体类时没有指明类名前缀,则用此选项值作为默认的类名前缀;
·Namespace(可选):指示同名称空间;
如果你有两个同名的被持久化的对象(classname相同),则必须将”auto-import” 选项值设为false,否则当你访问这个对象时NHibernate会抛出一个异常。
Class
<class
name="ClassName" (1=""
table="tableName"(2=""
discriminator-value="discriminator_value"(3=""
mutable="true|false"(4=""
schema="owner"(5=""
proxy="ProxyInterface"(6=""
dynamic-update="true|false"(7=""
dynamic-insert="true|false"(8=""
polymorphism="implicit|explicit"(9=""
where="arbitrary sql where condition"(10=""
persister="PersisterClass"(11=""
lazy="true|false"(12="")
/>
·name:持久类在.Net中的类型的的全名及其所在程序集;
·table:数据库中的数据表名称;
·discriminator-value(可选,默认值为类名):用于区分单独的子集,使用与多态形式;
·mutable(可选,默认值为true):指定类实例是否易变;
·schema(可选):重新指定hibernate-mapping中的Schema选项值;
·proxy(可选):指定用于实现惰性初始的接口,如果所有属性都被声明为Virtual,则可以将类名指定给此选项;
·dynamic-update(可选,默认值false):指示出NHibernate在运行时产生的Update SQL语句是否仅包含被修改了的字段;
·dynamic-insert:(可选,默认值false):指示出NHibernate在运行时产生的Insert SQL语句是否仅包含被值不为Null的字段;
·polymorphism(可选,默认值implict):指示出是否需要有确指明查询是否使用多态性;
·where(可选):指定Where SQL语句可以获取这个类类型的对象;
·persister(可选):指定用户自定义的IClassPersister;
·lazy(可选):将此项设为true等同与将它自己的类名赋予给proxy选项。
被映射的类必须声明一个Id与数据表中的主键相对应。Id其实也是被映射的类的一个属性,与使用Proerpty声明的属性不同的是ID属性值必须是唯一的,通过ID可以将对象转化为数据表中唯一的一条记录,同样也可以将数据表中的记录转化为对象。
<id
name="propertyName" (1=""
type="typename" (2=""
column="column_name" (3=""
unsaved-value="any|none|null|id_value" (4=""
access="field|property|nosetter|ClassName">(5)
<generator class="generatorClass"/>
</id>
·name(可选):属性的名称;
·type(可选):属性的类型;
·column(可选,默认值和属性名称相同):数据表中的主键字段名称,如果用户定义的属性名称和此字段名称相同,则此选项可忽略不写;
·unsaved-value(可选,默认值为null):为属性指定默认值,当用户创建一个新的实例时,会将该选 项值做为属性默认值;
·access(可选,默认为”property”):NHibernate对属性的访问策略;
Generator
此节指定了用于为该持久类实例产生ID属性值的.Net数据类型。如果需要一些参数对产生类实例ID属性值的数据类型进行配置或是初始化工作,可以使用”Param” 子节对其进行定义。
<id name="Id" type="Int64" column="uid" unsaved-value="0">
<generator class="NHibernate.Id.TableHiLoGenerator">
<param name="table">uid_table</param>
<param name="column">next_hi_value_column</param>
</generator>
</id>
所有的ID属性值产生器均实现了Nhibernate.Id.IdentifierGenerator接口。这是一个很简单的接口,一些应用程序会有他们自已专门的ID属性值产生器。尽量这样,NHibernate仍提供了一些内置的ID属性值产生器,
<property
name="propertyName"(1=""
column="column_name"(2=""
type="typename"(3=""
update="true|false"(4=""
insert="true|false"(5=""
formula="arbitrary SQL expression"(6=""
access="field|property|nosetter|ClassName"(7="")
/>
·name:要映射成的属性名称;
·column(可选,默认和name值相同):数据表中的字段名称;
·type(可选):指定属性类型;
·update(可选,默认值为true):是否将此属性包含到NHibernate产生的Update SQL子句中;
·insert(可选,默认值为true):是否将此属性包含到NHibernate产生的Insert SQL子句中;
·formula(可选):用于计算该属性值的一个SQL表达式。计算属性没有在数据表中没有相应的字段与其对应;
·access(可选,默认为”property”):NHibernate对属性的访问策略;