NHibernate開發環境與配置-NHibernate入門到精通系列2

上一篇: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
詳細的dialectIDriver的默認對應關係可以查看API文檔。

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

設置NHibernateDialect類名 - 允許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 將導致符號truefalse在生成的SQL中被翻譯成整數常量

show_sql

輸出所有SQL語句到控制檯.

可用值: true | false

hbm2ddl.auto

ISessionFactory創建時,自動檢查數據庫結構,或者將數據庫schemaDDL導出到數據庫。

使用 create-drop,在顯式關閉ISessionFactory時,將drop掉數據庫schema

可用值: create | create-drop

use_proxy_validator

是否啓用驗證接口或者是類是否可以使用代理,默認開啓。

(檢查實體類的屬性或者是方法是否被設置爲Virtual

可用值: true | false

transaction.factory_class

自定義ITransactionFactory的實現,默認爲NHibernate內建的AdoNetTransactionFactory

可用值: classname.of.TransactionFactory, assembly

其中SQL 方言是NHibernate針對不用的數據庫生成SQL語句的策略。

關係型數據庫

方言

備註

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對象的工廠。 它通過抽象將應用從底層的IDbConnectionIDbCommand隔離開。 僅供開發者擴展/實現用,並不暴露給應用程序使用。

IDriver (NHibernate.Driver.IDriver)

(可選的)一個封裝了不同ADO.NET providers之間的差異(利用參數命名轉換等ADO.NET支持的特性)的接口。

ITransactionFactory (NHibernate.Transaction.ITransactionFactory)

(可選的)生成ITransaction對象實例的工廠。 僅供開發者擴展/實現用,並不暴露給應用程序使用。


本節內容介紹到此,體系太大,有點複雜,看來學好NHibernate還真不是簡單的事!
發佈了45 篇原創文章 · 獲贊 4 · 訪問量 38萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章