标签:style blog class c code java
要实现一个自定义类型,可以实现NHibernate.UserTypes.IUserType或NHibernate.UserTypes.ICompositeUserType中的任一个, 并且使用类型的全限定类名来定义属性。请查看 NHibernate.DomainModel.DoubleStringType这个例子,看看它是怎么做的。
<property name="TwoStrings" type="NHibernate.DomainModel.DoubleStringType, NHibernate.DomainModel"> <column name="first_string"/> <column name="second_string"/> </property>
注意使用<column>标签来把一个属性映射到多个字段的做法。
ICompositeUserType, IEnhancedUserType, INullableUserType, IUserCollectionType, 和 IUserVersionType接口为更特殊的使用方式提供支持。
你甚至可以在一个映射文件中提供参数给一个IUserType。 为了这样做, 你的UserType必须实现NHibernate.UserTypes.IParameterizedType接口。为了给自定义类型提供参数,你可以在映射文件中使用<type>元素。
<property name="priority"> <type name="MyCompany.UserTypes.DefaultValueIntegerType"> <param name="default">0</param> </type> </property>
现在,IUserType 可以从传入的IDictionary对象中得到default 参数的值。
尽管 NHibernate 内建的丰富的类型和对组件的支持意味着你可能很少 需要使用自定义类型。不过, 为那些在你的应用中经常出现的(非实体)类使用自定义类型也是一个好方法。例如, 一个MonetaryAmount类使用ICompositeUserType来映射是不错的选择,虽然他可以很容易地被映射成组件。这样做的动机之一是抽象。使用自定义类型,以后假若你改变表示金额的方法时,它可以保证映射文件不需要修改。
meta-type属性使得应用程序能指定一个将数据库字段的值映射到持久化类的自定义类型。 这个持久化类包含有用id-type指定的标识符属性。 你必须指定从meta-type的值到类名的映射。
<any name="being" id-type="Int64" meta-type="string"> <meta-value value="TBL_ANIMAL" class="Animal"/> <meta-value value="TBL_HUMAN" class="Human"/> <meta-value value="TBL_ALIEN" class="Alien"/> <column name="table_name"/> <column name="id"/> </any>
NHibernate也支持meta-type="class"标签,这个例子里meta-value不是必须的, 因为 meta-value就是持久化类名(persistentClass.FullName)。
<any name="being" id-type="Int64" meta-type="class"> <column name="table_name"/> <column name="id"/> </any>
但你使用meta-type="class"在查询语句里设置参数时,你必须使用下面的代码:
SetParameter("paramName", typeof(YourClass).FullName, NHibernateUtil.ClassMetaType)
映射文件部分:
<any name="propertyName" (1) id-type="idtypename" (2) meta-type="metatypename" (3) cascade="cascade_style" (4) access="field|property|ClassName" (5) optimistic-lock="true|false" (6) > <meta-value ... /> <meta-value ... /> ..... <column .... /> <column .... /> ..... </any>
说明:
(1) |
name: 属性名。 |
(2) |
id-type: 标识符类型。 |
(3) |
meta-type (可选 -默认是 string): 允许辨别标志(discriminator)映射的任何类型。 |
(4) |
cascade (可选 -默认是none): 级联的类型。 |
(5) |
access (可选 -默认是 property): NHibernate 用来访问属性值的策略。 |
(6) |
optimistic-lock (可选 -默认是 true): 表明更新此组件是否需要获取乐观锁。换句话说,当这个属性变脏时,是否增加版本号(Version) 。 |
<class name="LineItem" table="`Line Item`"> <id name="Id" column="`Item Id`"/><generator class="assigned"/></id> <property name="ItemNumber" column="`Item #`"/> ... </class>
<hibernate-mapping> <subclass name="Eg.Subclass.DomesticCat, Eg" extends="Eg.Cat, Eg" discriminator-value="D"> <property name="name" type="string"/> </subclass> </hibernate-mapping>
被标明为generated的属性还必须是 non-insertable和 non-updateable的。只有(version)(可选),时间戳 (可选)和属性可以被标明为generated。
第一种模式是在映射文件中显式声明CREATE和DROP命令:
<nhibernate-mapping> ... <database-object> <create>CREATE TRIGGER my_trigger ...</create> <drop>DROP TRIGGER my_trigger</drop> </database-object> </nhibernate-mapping>
第二种模式是提供一个类,这个类知道如何组织CREATE和DROP命令。这个特别类必须实现NHibernate.Mapping.IAuxiliaryDatabaseObject接口。
<hibernate-mapping> ... <database-object> <definition class="MyTriggerDefinition, MyAssembly"/> </database-object> </hibernate-mapping>
你也可以在配置文件里设置参数传给数据库对象。
<hibernate-mapping> ... <database-object> <definition class="MyTriggerDefinition, MyAssembly"> <param name="parameterName">parameterValue</param> </definition> </database-object> </hibernate-mapping>
NHibernate可以调用IAuxiliaryDatabaseObject.SetParameterValues方法接受dictionary参数。
还有,这些数据库对象可以特别指定为仅在特定的方言中才使用。
<hibernate-mapping> ... <database-object> <definition class="MyTriggerDefinition"/> <dialect-scope name="NHibernate.Dialect.Oracle9Dialect"/> <dialect-scope name="NHibernate.Dialect.OracleDialect"/> </database-object> </hibernate-mapping>
NHIBERNATE之映射文件配置说明(转载4),布布扣,bubuko.com
标签:style blog class c code java
原文地址:http://www.cnblogs.com/tianmahygj/p/3737832.html