要實現一個自定義類型,能夠實現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>標籤來把一個屬性映射到多個字段的作法。app
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 參數的值。spa
儘管 NHibernate 內建的豐富的類型和對組件的支持意味着你可能不多 須要使用自定義類型。不過, 爲那些在你的應用中常常出現的(非實體)類使用自定義類型也是一個好方法。例如, 一個MonetaryAmount類使用ICompositeUserType來映射是不錯的選擇,雖然他能夠很容易地被映射成組件。這樣作的動機之一是抽象。使用自定義類型,之後倘若你改變表示金額的方法時,它能夠保證映射文件不須要修改。hibernate
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)。code
<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)
映射文件部分:blog
<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>