<a href="http://www.cnblogs.com/wolf-sun/p/3694592.html">[nhibernate]體系結構</a>
在上篇文章學習了orm和nhibernate相關概念,這篇文章主要學習isessionfactory如何配置。
因為nhibernate被設計為可以在許多不同環境下工作,是以它有很多配置參數。不過,大部分都已經有預設值了。nhibernate.test.dll包含了一個示例的配置檔案app.config,它示範了一些可變的參數。
nhibernate. cfg.configuration的一個執行個體代表了應用程式中所有的.net類到sql資料庫的映射集合。configuration用于構造一個(不可變的)isessionfactory。這些映射是從一些xml映射檔案中編譯得來的。
你可以得到一個configuration的執行個體,直接執行個體化它即可。
一個例子
從兩個xml配置檔案(和exe檔案在同一個目錄下)的映射中初始化:
某些情況下,有一個更好的方法是讓nhibernate自行用getmainifestresourcestream()來裝載映射檔案。
nhibernate就會在這些類型的程式集的嵌入的資源中尋找叫做nhibernate.auction.item.hbm.xml和nhibernate.auction.bid.hbm.xml的映射檔案。這種方法取消了所有對檔案名的寫死。
另外一個(可能是最好的)方法是讓nhibernate讀取一個程式集中的所有的配置檔案:
nhibernate将會周遊程式集查找任何以hbm.xml結尾的檔案。這種方法取消了所有對檔案名的寫死并且確定程式集中的配置檔案都會被加載。
在使用vs或者nant生成的程式集時請確定hbm.xml檔案是作為嵌入資源(embedded resources)添加的。
configuration也可以指定一些可選的配置項。
configuration是僅在配置期使用的隊形,從第一個sessionfactory開始建立的
時候,它就失效了。
當所有的映射都被configuration解析之後,應用程式為了得到isession執行個體,必須先得到它的工廠。這個工廠應該是被應用程式的所有線程共享的:
當然,nhibernate并不禁止你的程式執行個體化多個isessionfactory。在你使用不止一個資料庫的時候,這就很有用了。
isessionfactory可以使用一個使用者自行提供的ado.net連接配接來打開一個isession。這種設計可以讓應用程式來自己管理ado.net連接配接:
應用程式必須小心,不能在同一個連接配接上打開兩個并行的isession
另一種方法就是,你可以讓isessionfactory替你打開連接配接,sessionfactory必須事先知道ado.net連接配接的參數,有幾種不同的方法設定參數:
1.通過提供一個idictionary執行個體給configuration.properties.
2.在名為nhibernate的system.configuration.namevaluesectionhandler類型的配置節點中添加屬性。
3.在hibernate.cfg.xml中包含<property>元素。
如果你使用這種方法,打開一個isession是非常簡單的:
所有的nhibernate屬性名和限制都在nhibernate.cfg.environment類中定義。ado.net連接配接配置最重要的幾項設定:
假若你設定了如下的屬性,nhibernate會使用ado.net data provider來得到連接配接:
屬性名
用途
hibernate.connection.provider_class
定制iconnectionprovider的類型.
例如:full.classname.of.connectionprovider (如果提供者建立在nhibernate中), 或者 full.classname.of.connectionprovider, assembly (如果使用一個自定義的iconnectionprovider接口的實作,它不屬于nhibernate)。
hibernate.connection.driver_class
定制idriver的類型.
full.classname.of.driver (如果驅動類建立在nhibernate中), 或者 full.classname.of.driver, assembly (如果使用一個自定義idriver接口的實作,它不屬于nhibernate)。
hibernate.connection.connection_string
用來獲得連接配接的連接配接字元串.
hibernate.connection.isolation
設定事務隔離級别. 請檢查 system.data.isolationlevel 來得到取值的具體意義并且檢視資料庫文檔以確定級别是被支援的。
例如: chaos, readcommitted, readuncommitted, repeatableread, serializable, unspecified
一個例子


下面是一些在運作時可以改變nhibernate欣慰的其他配置。所有這些都是可選的,也有預設值。
hibernate.dialect
nhibernate方言(dialect)的類名 - 可以讓nhibernate使用某些特定的資料庫平台的特性
例如: full.classname.of.dialect(如果方言建立在nhibernate中), 或者full.classname.of.dialect, assembly (如果使用一個自定義的方言的實作,它不屬于nhibernate)。
hibernate.default_schema
在生成的sql中,scheml/tablespace的全限定名.
例如: schema_name
hibernate.prepare_sql
是否準備sql語句
例如: true | false
hibernate.session_factory_name
sessionfactory被建立後将自動綁定這個名稱.
例如: some.name
hibernate.use_outer_join
允許使用外連接配接抓取。
例如:true | false
hibernate.cache.provider_class
指定一個自定義的cacheprovider緩存提供者的類名
例如: full.classname.of.cacheprovider(如果icacheprovider建立在nhibernate中), 或full.classname.of.cacheprovider, assembly(如果使用一個自定義的icacheprovider,它不屬于nhibernate)。
hibernate.query.substitutions
把nhibernate查詢中的一些短語替換為sql短語(比如說短語可能是函數或者字元)。
例如: hqlliteral=sql_literal, hqlfunction=sqlfunc
你總是可以為你的資料庫設定一個hibernate.dialect方言,它是nhibernate.dialect.dialect的一個子類。如果你不需要使用基于native或者sequence的主鍵自動生成算法,或者悲觀鎖定(使用isession.lock()或者iquery.setlockmode())的話,方言就可以不必指定。然而,假若你指定了一個方言,hibernate會為上面列出的一些屬性使用特殊預設值,省的你手工指定他們。
rdbms
方言
db2
nhibernate.dialect.db2dialect
postgresql
nhibernate.dialect.postgresqldialect
mysql
nhibernate.dialect.mysqldialect
oracle (any version)
nhibernate.dialect.oracledialect
oracle 9/10g
nhibernate.dialect.oracle9dialect
sybase
nhibernate.dialect.sybasedialect
microsoft sql server 2000
nhibernate.dialect.mssql2000dialect
microsoft sql server 7
nhibernate.dialect.mssql7dialect
firebird
nhibernate.dialect.firebirddialect
如果你的資料庫支援ansi或者oracle風格的外連接配接,外連接配接抓取可能提高性能,因為可以限制和資料庫互動的數量(代價是資料庫自身進行了更多的工作)。外連接配接抓取允許你在一個select語句中就可以得到一個由多對一或者一對一連接配接構成的對象圖。
預設情況下,抓取在葉對象,擁有代理的對象或者産生對自身的應用時終止。
對一個特定關聯來說,通過在xml映射檔案中設定outer-join屬性可以控制是否開啟抓取功能。
設定hibernate.use_outer_join為false将禁用全局的外連接配接抓取,設定為true将啟用所有一對一(one-to-one)和多對一(many to one)關聯中的外連接配接抓取預設情況下,它被設定為auto,即自動外連接配接。但是,一對多關聯和集合永遠不會使用外連接配接抓取,除非對每個特定的管理進行明确聲明。這一行為可以在運作時通過nhibernate查詢重載。
通過實作nhibernate.cache.icacheprovider接口,你可以整合一個第二級緩存進來。你可以通過hibernate.cache.provider_class選擇某個自定義的實作。
你可以使用hibernate.query.substitutions定義新的nhibernate查詢短語。比如說:
hibernate.query.substitutions true=1, false=0
會在生成的sql中把短語true和 false替換成整數值。
hibernate.query.substitutions tolowercase=lower
這可以讓你重新命名sql的lower 函數。
通過apache log4net,nhibernate記錄很多事件。
我們強烈建議你熟悉nhibernate's的log資訊。nhibernate's的很多工作都會盡量詳細的留下log,也沒有讓它變的難以閱讀。這是用來解決問題的最基本的設施。
isessionfactory的配置内容很多,也很難記,你可以通過如下方式實作配置資訊的智能提示,建立一個解決方案檔案夾,将下面兩個檔案拷入解決方案檔案夾,可實作智能提示。
本文來自
《nhibernate中文文檔》
部落格位址:
<a href="http://www.cnblogs.com/wolf-sun">http://www.cnblogs.com/wolf-sun/</a>
部落格版權:
本文以學習、研究和分享為主,歡迎轉載,但必須在文章頁面明顯位置給出原文連接配接。
如果文中有不妥或者錯誤的地方還望高手的你指出,以免誤人子弟。如果覺得本文對你有所幫助不如【推薦】一下!如果你有更好的建議,不如留言一起讨論,共同進步!
再次感謝您耐心的讀完本篇文章。
轉載:http://www.cnblogs.com/wolf-sun/p/3694901.html