天天看點

NHibernate 配置檔案的處理和使用多資料庫的多層架構思路(第三部分,附源代碼)

三、業務邏輯層 四、顯示層 

        這兩個就不多說了。

        下面給出 hibernate.cfg.xml 配置檔案的内容:

NHibernate 配置檔案的處理和使用多資料庫的多層架構思路(第三部分,附源代碼)

<? xml version="1.0" encoding="utf-8"  ?>

NHibernate 配置檔案的處理和使用多資料庫的多層架構思路(第三部分,附源代碼)

< hibernate-configuration   xmlns ="urn:nhibernate-configuration-2.2"   >

NHibernate 配置檔案的處理和使用多資料庫的多層架構思路(第三部分,附源代碼)

     < session-factory  name ="NHibernate.Test" >

NHibernate 配置檔案的處理和使用多資料庫的多層架構思路(第三部分,附源代碼)

         <!--  properties  -->

NHibernate 配置檔案的處理和使用多資料庫的多層架構思路(第三部分,附源代碼)

         < property  name ="connection.provider" > NHibernate.Connection.DriverConnectionProvider </ property >

NHibernate 配置檔案的處理和使用多資料庫的多層架構思路(第三部分,附源代碼)

         < property  name ="connection.driver_class" > NHibernate.Driver.SqlClientDriver </ property >

NHibernate 配置檔案的處理和使用多資料庫的多層架構思路(第三部分,附源代碼)

         < property  name ="show_sql" > false </ property >

NHibernate 配置檔案的處理和使用多資料庫的多層架構思路(第三部分,附源代碼)

         < property  name ="dialect" > NHibernate.Dialect.MsSql2005Dialect </ property >

NHibernate 配置檔案的處理和使用多資料庫的多層架構思路(第三部分,附源代碼)

         < property  name ="use_outer_join" > true </ property >

NHibernate 配置檔案的處理和使用多資料庫的多層架構思路(第三部分,附源代碼)

         <!--  mapping files  -->

NHibernate 配置檔案的處理和使用多資料庫的多層架構思路(第三部分,附源代碼)

         <!--  <mapping assembly="Novelty.Model" />  -->

NHibernate 配置檔案的處理和使用多資料庫的多層架構思路(第三部分,附源代碼)

     </ session-factory >

NHibernate 配置檔案的處理和使用多資料庫的多層架構思路(第三部分,附源代碼)

</ hibernate-configuration >

        最後,附帶的提一個在 NHibernate-1.2.0.GA 版本中遇見的問題。

        如果使用 NHibernate-1.2.0.GA,持久類的屬性需要加 virtual 的問題。

        如果不加,就會報這個錯誤: method get_(屬性或是方法名稱) should be virtual。

        由于NHibernate 1.2.0 預設對類用了延遲加載,是以需要要給屬性或是方法名稱加上 virtual。

另外,我搜尋到了一篇 blog (見參考資料7),給出了一段英文解釋!試着翻譯一下,或者大家直接看原文!

        1. 你可能要遵循異常建議,并給你所有的屬性加上virtual,這樣確定你的類是非密封的(non-sealed)。很明顯,如果你認為你想要利用延遲加載代理的特點,你應該這樣做。可是,假如你有一個可繼承的基類,或者可能僅僅是它困繞着你:一個“透明”的持久層架構規定了你如何設計你的有價值的類的某些方面。那麼第二項和第三項選擇就來了。它們兩個涉及到改變支援舊的行為。

        2.針對某一個特定的類改變延遲加載代理設定,你可能要在<class>映射元素中mapping增加一個lazy='false'的屬性。這可能看起來象下面的設定:

<class

    name="NorthwindClasses.Category, NorthwindClasses"

    table="Categories"

    lazy="false"

>

        3. 為了在一個特定的映射檔案中為所有的類改變延遲加載代理設定,你可能要增加<hibernate-mapping>元素中增加一個lazy='false'的屬性,如下:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0" default-lazy="false"> 

        不幸的是,如果你的每一個類對應一個<hibernate-mapping>檔案,這類實踐是我個人遵循和推薦的,那麼選擇三可能并不能真正地幫助你太多。 雖然太糟糕了,但是看起來似乎沒有任何辦法在 <nhibernate> 的全局配置中設定這個預設值。但是如果你恰好遇見你的所有類都在一個 .hbm.xml 檔案裡,"default-lazy"屬性可以幫助你解決困難。

        5月17号補充:  Cheney 在評論中說在配置檔案中加上下面的設定可解決這個問題.也就是說我不想利用延遲加載代理的特點.:)

       <property name="use_proxy_validator">false</property>

       謝謝指點!

       我在論壇上又查到了一個 Hibernate Team 的 sergey 說了下面一段話: 不要禁用驗證.要麼将成員聲明為 virtual,要麼在将出錯的類的延遲加載設定為 false. 隻有不要報告任何錯誤才禁用驗證.原話Don't disable the validation. Either declare the members virtual, or set lazy="false" for the failing class. Disable the validation only after it doesn't report any errors.

:

另外兩部分:

NHibernate 配置檔案的處理和使用多資料庫的多層架構思路(第一部分)

http://blog.csdn.net/scucj/archive/2007/05/16/1610858.aspx

NHibernate 配置檔案的處理和使用多資料庫的多層架構思路(第二部分)

http://blog.csdn.net/scucj/archive/2007/05/16/1610860.aspx

        全文結束!

2007 年 6月6号 補充:

我還是提供一個簡單的解決方案的源代碼下載下傳吧!雖然三部分加兩個補充部分說了很多少,但是有解決方案的源代碼更清晰一些!

下載下傳位址

參考資料如下:

(1) 基于NHibernate的三層結構應用程式開發初步:

http://www.cnblogs.com/terrylee/archive/2006/02/16/331978.html

(2) NHibernate的靈活配置:

http://www.cnblogs.com/renrenqq/archive/2006/08/02/466056.html

(3) 第1章 單件模式(Single Pattern):

http://terrylee.cnblogs.com/archive/2005/12/09/293509.html

(4) 在Nhibernate中執行sql語句 :

http://www.cnblogs.com/oldhorse/archive/2006/07/08/445958.html

(5) IList<T> 轉換成 DataSet :

http://www.cnblogs.com/yyw84/archive/2006/08/15/463480.html

(6) 面向對象的NHibernate資料查詢語言-HQL

http://www.cnblogs.com/me-sa/archive/2007/04/09/705323.html

 (7) 關于NHibernate1.2延遲加載及InvalidProxyTypeException異常

http://blog.csdn.net/lulustray/archive/2007/04/20/1571506.aspx