NHIBERNATE之映射文件配置說明(轉載4)

 

二10、自定義值類型

   開發者建立屬於他們本身的值類型也是很容易的。好比說,你可能但願持久化 Int64類型的屬性, 持久化成爲 VARCHAR 字段。NHibernate沒有內置這樣一種類型。自定義類型可以映射一個屬性(或集合元素)到不止一個數據庫表字段。 好比說,你可能有這樣的屬性:  Name { get; set; },這是 String類型的,對應的持久化到三個字段: FIRST_NAMEINITIALSURNAME

要實現一個自定義類型,能夠實現NHibernate.UserTypes.IUserTypeNHibernate.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

  ICompositeUserTypeIEnhancedUserTypeINullableUserTypeIUserCollectionType, 和 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

二11、任意(Any)類型映射

   這是屬性映射的又一種類型。 <any> 映射元素定義了一種從多個表到類的多態關聯。 這種類型的映射經常須要多於一個字段。第一個字段持有被關聯實體的類型,其餘的字段持有標識符。 對這種類型的關聯來講,不可能指定一個外鍵約束,因此這固然不是映射(多態)關聯的一般的方式。 你只應該在很是特殊的狀況下使用它(好比,審計log,用戶會話數據等等)。

  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) 。  

二12、SQL中引號包圍的標識符

   你可強制NHibernate在生成的SQL中把標識符用引號先後包圍起來,這須要在映射文檔中使用反向引號(`)把表名或者字段名包圍(可能比較拗口,請看下面的例子)。NHibernate會使用相應的SQL Dialect(方言)來使用正確的引號風格(一般是雙引號,可是在SQL Server中是括號,MySQL中是反向引號)。
<class name="LineItem" table="`Line Item`">
    <id name="Id" column="`Item Id`"/><generator class="assigned"/></id>
    <property name="ItemNumber" column="`Item #`"/>
    ...
</class>

 

二十3、模塊化映射文件

   容許在獨立的映射文檔中定義 subclassjoined-subclass,直接位於 hibernate-mapping下。這就可讓你每次擴展你的類層次的時候,加入新的映射文件就好了。在子類的映射中你必須指定一個 extends屬性,指明先前已經映射過的超類。使用這個功能的時候,必定要注意映射文件的排序是很是重要的!
<hibernate-mapping>
        <subclass name="Eg.Subclass.DomesticCat, Eg"
            extends="Eg.Cat, Eg" discriminator-value="D">
             <property name="name" type="string"/>
        </subclass>
</hibernate-mapping>

 

二十4、數據庫生成屬性(Generated Properties)

   Generated properties指的是其值由數據庫生成的屬性。通常來講,若是對象有任何屬性由數據庫生成值,NHibernate應用程序須要進行刷新( Refresh)。但若是把屬性標明爲generated,就能夠轉由NHibernate來負責這個動做。實際上。對定義了generated properties的實體,每當NHibernate執行一條SQL INSERT或者UPDATE語句,會馬上執行一條select來得到生成的值。

  被標明爲generated的屬性還必須是 non-insertable和 non-updateable的。只有(version)(可選),時間戳 (可選)和屬性能夠被標明爲generated。

  • never (默認) 標明此屬性值不是從數據庫中生成。
  • insert - 標明此屬性值在insert的時候生成,可是不會在隨後的update時從新生成。好比說建立日期就歸屬於這類。
  • always - 標明此屬性值在insert和update時都會被生成。 

二十5、數據庫輔助對象

   幫助CREATE和DROP任意數據庫對象,與NHibernate的schema交互工具組合起來,能夠提供在NHibernate映射文件中徹底定義用戶schema的能力。雖然這是爲建立和銷燬trigger(觸發器)或stored procedure(存儲過程)等特別設計的,實際上任何能夠在 IDbCommand.ExecuteNonQuery()方法中執行的SQL命令均可以在此使用(好比ALTER, INSERT,等等)。本質上有兩種模式來定義輔助數據庫對象。

  第一種模式是在映射文件中顯式聲明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>
相關文章
相關標籤/搜索