上一篇:NHibernate ORM介紹及優缺點-NHibernate入門到精通系列1中介紹了NHibernate與ORM,讀者對其有一個感性的認識。
本節,將繼續此係統,介紹:NHibernate開發環境與配置和其體系結構知識。
下面爲正文內容:
一、NHibernate的開發環境
官網地址:http://nhforge.org/
NHibernate3爲目前最新的版本,其下載地址是:http://sourceforge.net/projects/nhibernate/files/NHibernate/
下載並解壓NHibernate-3.0.0.GA-bin.zip後,如圖1.1所示。
文件夾介紹:
Required_Bins:NHiberante主程序的dll程序集。
(1).Antlr3.Runtime.dll爲:Antlr的程序集。Antlr(ANother Tool for Language Recognition)是一個工具,它爲我們構造自己的識別器(recognizers)、編譯器(compiler)和轉換器(translators)提供了一個基礎。通過定義自己的語言規則,Antlr可以爲我們生成相應的語言解析器,這樣便可以省卻了自己全手工打造的勞苦。
(2).Iesi.Collections.dll爲:NHibernate程序的集合庫,因爲在.NET4.0之前,沒有提供ISet這樣的集合,所以NHiberante框架的設計者們就將ISet這樣的集合放置在這個程序集裏。我建議NHiberante框架的設計人員,在.NET4.0以後的程序,使用System.Collections.Generic.ISet<T>這個接口。
(3).NHibernate.dll爲主程序集
(4).Remotion.Data.Linq.dll爲:NHibernate to Linq的類庫。
(5).nhibernate-configuration.xsd和NHibernate-mapping.xsd分別爲NHibernate程序配置和映射配置的xsd文件,我們把這個兩個文件複製到Microsoft Visual Studio安裝目錄的\Xml\Schemas下,就會有xml的自動提示功能。
- 名爲“Required_For_LazyLoading”的文件夾所放置的是NHiberante延遲加載代理用到的程序集,其中提供了Castle、LinFu、Spring這三種代理類。我選擇其中一項就可以了。
- 名爲“Configuration_Templates”的文件夾所放置的是NHiberante的配置模板。已給出了FireBird、MSSQL、MySql、Oracle、PostgreSQL、SQLite的配置模板。
二:NHibernate開發環境與配置
由於NHibernate是爲了能在各種不同環境下工作而設計的, 因此存在着大量的配置參數. 幸運的是多數配置參數都有比較直觀的默認值。我打開MSSQL.cfg文件,如圖所示,可以觀察到NHibernate的配置。
圖3.1
3.1 NHibernate提供ADO.NET連接配置
屬性名 |
用途 |
connection.provider_class |
實現IConnectionProvider接口的類型。 例如: (如果是NHibernate內部的IConnectionProvider實現類)full.classname.of.ConnectionProvider, (如果是自定義的NHibernate外部的IConnectionProvider實現類 )full.classname.of.ConnectionProvider, assembly。 |
connection.driver_class |
如果使用DriverConnectionProvider,實現IDriver接口的類型。 (如果是NHibernate內部的實現的IDriver類型)full.classname.of.Driver (如果是自定義的NHibernate外部的IDriver實現類 )full.classname.of.Driver, assembly。 這個配置通常是不需要配置的,如果設置好了hibernate.dialect一般會自動選好對應的IDriver。
|
connection.connection_string |
數據庫連接字符串 |
connection.connection_string_name |
數據庫連接字符串名稱(定義在.Net配置文件<connectionStrings>配置節裏面的連接字符串名。 |
connection.isolation |
ADO.NET事務隔離級別, 查看System.Data.IsolationLevel類來了解各個值的具體意義, 但請注意多數數據庫都不支持所有的隔離級別。 例如: Chaos, ReadCommitted, ReadUncommitted, RepeatableRead, Serializable, Unspecified |
connection.release_mode |
指定ADO.NET何時釋放數據庫連接。 例如: auto (默認) | on_close | after_transaction 注意,這些設置僅對通過ISessionFactory.OpenSession得到的ISession起作用。 對於通過ISessionFactory.GetCurrentSession得到的ISession, 所配置的ICurrentSessionContext實現控制這些ISession的連接釋放模式。 |
command_timeout |
指定NHibernate生成的IDbCommands對象的超時時間。 . |
adonet.batch_size |
指定用ADO.Net的批量更新的數量,默認設置爲0(不啓用該功能)。 |
proxyfactory.factory_class |
代理工廠配置。用於指定是哪個中間件提供的延遲加載代理 |
3.2 可選的配置屬性
有大量屬性能用來控制NHibernate在運行期的行爲. 它們都是可選的, 並擁有適當的默認值。
屬性名 |
用途 |
dialect |
設置NHibernate的Dialect類名 - 允許NHibernate針對特定的關係數據庫生成優化的SQL 可用值: full.classname.of.Dialect, assembly |
default_schema |
在生成的SQL中, 將給定的schema/tablespace附加於非全限定名的表名上。 可用值: SCHEMA_NAME |
use_outer_join |
允許外連接抓取,已棄用,請使用max_fetch_depth。 可用值: true | false |
max_fetch_depth |
爲單向關聯(一對一, 多對一)的外連接抓取(outer join fetch)樹設置最大深度。 值爲0意味着將關閉默認的外連接抓取 可用值:建議在0 到3之間取值。 |
use_reflection_optimizer |
開啓運行時代碼動態生成來替代運行時反射機制(系統級屬性)。 使用這種方式的話程序在啓動會耗費一定的性能,但是在程序運行期性能會有更好的提升。 注意即使關閉這個優化, Hibernate還是需要CGLIB. 你不能在hibernate.cfg.xml中設置此屬性。 這個屬性不能在hibernate.cfg.xml或者是應用程序配置文件<hibernate-configuration> 配置節中設置。 可用值: true | false |
bytecode.provider |
指定字節碼provider用於優化NHibernate反射性能。 null代表完全關閉性能優化, lcg用於輕量級的代碼動態生成,codedom基於CodeDOM代碼動態生成。 可用值: null | lcg | codedom |
cache.provider_class |
設置緩存實現類(實現ICacheProvider接口的類) 可用值: classname.of.CacheProvider, assembly |
cache.use_minimal_puts |
以頻繁的讀操作爲代價, 優化二級緩存來最小化寫操作(對羣集緩存有效)。 可用值: true | false |
cache.use_query_cache |
允許查詢緩存, 個別查詢仍然需要被設置爲可緩存的. 可用值: true | false |
cache.query_cache_factory |
自定義實現IQueryCacheFactory接口的類名, 默認爲內建的StandardQueryCacheFactory。 可用值: classname.of.QueryCacheFactory, assembly |
cache.region_prefix |
二級緩存區域名的前綴。 可用值: prefix |
query.substitutions |
將NHibernate查詢中的符號映射到SQL查詢中的符號 (符號可能是函數名或常量名字)。 可用值: hqlLiteral=SQL_LITERAL, hqlFunction=SQLFUNC query.substitutions true=1, false=0 將導致符號true和false在生成的SQL中被翻譯成整數常量 |
show_sql |
輸出所有SQL語句到控制檯. 可用值: true | false |
hbm2ddl.auto |
在ISessionFactory創建時,自動檢查數據庫結構,或者將數據庫schema的DDL導出到數據庫。 使用 create-drop時,在顯式關閉ISessionFactory時,將drop掉數據庫schema。 可用值: create | create-drop |
use_proxy_validator |
是否啓用驗證接口或者是類是否可以使用代理,默認開啓。 (檢查實體類的屬性或者是方法是否被設置爲Virtual) 可用值: true | false |
transaction.factory_class |
自定義ITransactionFactory的實現,默認爲NHibernate內建的AdoNetTransactionFactory。 可用值: classname.of.TransactionFactory, assembly |
關係型數據庫 |
方言 |
備註 |
DB2 |
NHibernate.Dialect.DB2Dialect |
|
DB2 for iSeries (OS/400) |
NHibernate.Dialect.DB2400Dialect |
|
Ingres |
NHibernate.Dialect.IngresDialect |
|
PostgreSQL |
NHibernate.Dialect.PostgreSQLDialect |
|
PostgreSQL 8.1 |
NHibernate.Dialect.PostgreSQL81Dialect |
方言在PostgreSQL8.1中現在支持FOR UPDATE NOWAIT了。 |
PostgreSQL 8.2 |
NHibernate.Dialect.PostgreSQL82Dialect |
方言在PostgreSQL8.2中現在支持在 DROP TABLE和DROP SEQUENCE中使用IF EXISTS關鍵字了。 |
MySQL 3 or 4 |
NHibernate.Dialect.MySQLDialect |
|
MySQL 5 |
NHibernate.Dialect.MySQL5Dialect |
|
Oracle 8g |
NHibernate.Dialect.Oracle8iDialect |
|
Oracle 9g |
NHibernate.Dialect.Oracle9Dialect |
|
Oracle 10/11g |
NHibernate.Dialect.Oracle10gDialect |
|
Sybase Adaptive Server Enterprise |
NHibernate.Dialect.SybaseDialect |
|
Sybase Adaptive Server Anywhere |
NHibernate.Dialect.SybaseAnywhereDialect |
|
Microsoft SQL Server 2000 |
NHibernate.Dialect.MsSql2000Dialect |
|
Microsoft SQL Server 2005 |
NHibernate.Dialect.MsSql2005Dialect |
|
Microsoft SQL Server 2008 |
NHibernate.Dialect.MsSql2008Dialect |
|
Microsoft SQL Server 2005 Everywhere Edition |
NHibernate.Dialect.MsSqlCeDialect |
|
Microsoft SQL Server 7 |
NHibernate.Dialect.MsSql7Dialect |
|
Firebird |
NHibernate.Dialect.FirebirdDialect |
把driver_class設置爲 NHibernate.Driver.FirebirdClientDriver啓用Firebird provider for .NET 2.0。 |
SQLite |
NHibernate.Dialect.SQLiteDialect |
把driver_class設置爲NHibernate.Driver.SQLite20Driver啓用System.Data.SQLite provider for .NET 2.0。 |
Ingres 3.0 |
NHibernate.Dialect.IngresDialect |
|
然後我們再過頭來了解下整個體系結構:
三:NHibernate的結構體系
圖2.1
從圖2.1可以看出,NHibernate使用數據庫和配置信息來爲應用程序提供持久化服務(以及持久的對象)。
我們來更詳細地看一下NHibernate運行時體系結構。由於NHibernate非常靈活,且支持多種應用方案, 所以我們這隻描述一下兩種極端的情況。“輕型”的體系結構方案,要求應用程序提供自己的ADO.NET 連接並管理自己的事務。這種方案使用了NHibernate API的最小子集:
圖2.2
“全面解決”的體系結構方案,將應用層從底層的ADO.NET API中抽象出來,而讓NHibernate來處理這些細節。
圖2.3
圖2.3中各個對象的定義如下:
ISessionFactory (NHibernate.ISessionFactory)針對單個數據庫映射關係經過編譯後的內存鏡像,是線程安全的(不可變)。 它是生成ISession的工廠,本身要用到IConnectionProvider。 該對象可以在進程或集羣的級別上,爲那些事務之間可以重用的數據提供可選的二級緩存。
ISession (NHibernate.ISession)表示應用程序與持久儲存層之間交互操作的一個單線程對象,此對象生存期很短。 其隱藏了ADO.NET連接,也是 ITransaction的工廠。 其會持有一個針對持久化對象的必選(第一級)緩存, 在遍歷對象圖或者根據持久化標識查找對象時會用到。
持久的對象及其集合(Persistent Objects and Collections)帶有持久化狀態的、具有業務功能的單線程對象,此對象生存期很短。 這些對象可能是普通的POCOs, 唯一特殊的是他們正與(僅僅一個)ISession相關聯。 一旦這個ISession被關閉, 這些對象就會脫離持久化狀態,這樣就可被應用程序的任何層自由使用。 (例如,用作跟表示層打交道的數據傳輸對象。)
瞬態(transient)和脫管(detached)的對象及其集合那些目前沒有與ISession關聯的持久化類實例。 他們可能是在被應用程序實例化後, 尚未進行持久化的對象。 也可能是因爲實例化他們的ISession已經被關閉而脫離持久化的對象。
ITransaction (NHibernate.ITransaction)(可選的)應用程序用來指定原子操作單元範圍的對象,它是單線程的,生命週期很短。 它通過抽象將應用從底層具體的ADO.NET事務隔離開。 某些情況下,一個ISession之內可能包含多個ITransaction對象。
IConnectionProvider (NHibernate.Connection.IConnectionProvider)(可選的)生成ADO.NET連接以及Command對象的工廠。 它通過抽象將應用從底層的IDbConnection或IDbCommand隔離開。 僅供開發者擴展/實現用,並不暴露給應用程序使用。
IDriver (NHibernate.Driver.IDriver)(可選的)一個封裝了不同ADO.NET providers之間的差異(利用參數命名轉換等ADO.NET支持的特性)的接口。
ITransactionFactory (NHibernate.Transaction.ITransactionFactory)(可選的)生成ITransaction對象實例的工廠。 僅供開發者擴展/實現用,並不暴露給應用程序使用。
本節內容介紹到此,體系太大,有點複雜,看來學好NHibernate還真不是簡單的事!