NHibernate配置文件和映射文件的详解
Hibernate-mapping映射文件中不仅描述了NHibernate在运行时需要使用到的元素类型和属性,同时还包含了额外的元素属性,如被映射字段是否允许为空等。映射文件中不仅描述了NHibernate在运行时需要使用到的元素类型和属性,同时还包含了额外的元素属性,如被映射字段是否允许为空等。
NHiberbate的基本构成接口:
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 schema。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(可选,默认值为 |