發(fā)文章
發(fā)文工具
撰寫(xiě)
網(wǎng)文摘手
文檔
視頻
思維導(dǎo)圖
隨筆
相冊(cè)
原創(chuàng)同步助手
其他工具
圖片轉(zhuǎn)文字
文件清理
AI助手
留言交流
由于NHibernate是為了能在各種不同環(huán)境下工作而設(shè)計(jì)的, 因此存在著大量的配置參數(shù).
幸運(yùn)的是多數(shù)配置參數(shù)都 有比較直觀的默認(rèn)值, 并有隨Hibernate一同分發(fā)的配置樣例 App.config(位于src\NHibernate.Test)來(lái)展示各種配置選項(xiàng).
所需做的僅僅是將這個(gè)樣例文件復(fù)制到自己的項(xiàng)目路徑下并做一些自定義的修改.
一個(gè)NHibernate.Cfg.Configuration實(shí)例代表了一個(gè)應(yīng)用程序中.NET類(lèi)型 到SQL數(shù)據(jù)庫(kù)映射的完整集合.
Configuration被用來(lái)構(gòu)建一個(gè)(不可變的 (immutable)) ISessionFactory. 映射定義則由不同的XML映射定義文件編譯而來(lái)。
你可以直接實(shí)例化Configuration來(lái)獲取一個(gè)實(shí)例, 下面是一個(gè)例子如何加載兩個(gè)xml映射文件。
1 Configuration cfg = new Configuration() 2 .AddFile("Item.hbm.xml") 3 .AddFile("Bid.hbm.xml");
另一個(gè)方法(有時(shí)候可能會(huì)更好),讓NHibernate從嵌入式資源里面加載映射文件:
1 Configuration cfg = new Configuration() 2 .AddClass(typeof(NHibernate.Auction.Item)) 3 .AddClass(typeof(NHibernate.Auction.Bid));
NHibernate將會(huì)在當(dāng)前應(yīng)用程序集中中尋找名字為NHibernate.Auction.Item.hbm.xml和 NHibernate.Auction.Bid.hbm.xml嵌入式資源文件. 這種方式消除了任何對(duì)文件名的硬編碼(hardcoded).
還有一種方法(應(yīng)該是最好的),讓NHibernate自動(dòng)到程序集加載所有的嵌入式資源xml映射文件。
1 Configuration cfg = new Configuration() 2 .AddAssembly( "NHibernate.Auction" );
NHibernate會(huì)自動(dòng)到應(yīng)用程序集里查找所有的以.hbm.xml結(jié)尾的資源文件。這種方式消除了任何對(duì)文件名的硬編碼(hardcoded), 并且確保了應(yīng)用程序集里的所有的xml映射文件都被加載。
如果使用Visual Studio .NET 和 NAnt 來(lái)編譯應(yīng)用程序集的話,請(qǐng)確保.hbm.xml文件被作為嵌入式資源編譯進(jìn)應(yīng)用程序集。
Configuration也允許你指定配置屬性:
1 IDictionary<string, string> props = new Dictionary<string, string>(); 2 ... 3 Configuration cfg = new Configuration() 4 .AddClass(typeof(NHibernate.Auction.Item)) 5 .AddClass(typeof(NHibernate.Auction.Bind)) 6 .SetProperties(props);
Configuration實(shí)例被設(shè)計(jì)成啟動(dòng)期間(configuration-time)對(duì)象, 一旦ISessionFactory創(chuàng)建完成它就被丟棄了。
當(dāng)所有映射定義被Configuration解析后, 應(yīng)用程序必須獲得一個(gè)用于構(gòu)造ISession實(shí)例的工廠。 這個(gè)工廠將被應(yīng)用程序的所有線程共享:
1 ISessionFactory sessions = cfg.BuildSessionFactory();
NHibernate允許你的應(yīng)用程序創(chuàng)建多個(gè)ISessionFactory實(shí)例。這對(duì)使用多個(gè)數(shù)據(jù)庫(kù)的應(yīng)用來(lái)說(shuō)很有用。
ISessionFactory可以通過(guò)用戶自己創(chuàng)建的ADO.NET連接創(chuàng)建一個(gè)ISession, 這樣的設(shè)計(jì)可以讓你讓你們的程序更方便的獲取數(shù)據(jù)庫(kù)連接:
1 IDbConnection conn = myApp.GetOpenConnection(); 2 ISession session = sessions.OpenSession(conn); 3 4 // do some data access work
注意不要用同一個(gè)ADO.NET打開(kāi)兩個(gè)不同的ISession!
另一種方法就是,你可以讓ISessionFactory替你打開(kāi)連接。ISessionFactory必須事先知道ADO.NET連接的參數(shù),有幾種不同的方法設(shè)置參數(shù):
通過(guò)提供一個(gè)IDictionary實(shí)例給Configuration.SetProperties()。
在名為nhibernate的System.Configuration.NameValueSectionHandler類(lèi)型的配置節(jié)點(diǎn)添加屬性。
在應(yīng)用程序的配置文件中的配置節(jié)里包含 <property>元素,配置節(jié)命名為 hibernate-configuration,并且要被設(shè)置為使用NHibernate.Cfg.ConfigurationSectionHandler處理。 XML名稱空間要被設(shè)置為urn:nhibernate-configuration-2.2。
在hibernate.cfg.xml 中包含 <property>元素(后面會(huì)繼續(xù)討論)。
如果你使用這種方法,打開(kāi)一個(gè)ISession是非常簡(jiǎn)單的:
1 ISession session = sessions.OpenSession(); // open a new Session 2 // do some data access work, an ADO.NET connection will be used on demand
所有的NHibernate屬性名和約束都在 NHibernate.Cfg.Environment類(lèi)中定義。我們討論一下ADO.NET連接配置最重要的幾項(xiàng)設(shè)置:
假若你設(shè)置了如下的屬性,NHibernate會(huì)使用ADO.NET Data Provider來(lái)得到連接:
表 3.1. NHibernate ADO.NET 屬性
例如: (如果是NHibernate內(nèi)部的IConnectionProvider實(shí)現(xiàn)類(lèi))full.classname.of.ConnectionProvider,(如果是自定義的NHibernate外部的IConnectionProvider實(shí)現(xiàn)類(lèi) )full.classname.of.ConnectionProvider, assembly。
(如果是NHibernate內(nèi)部的實(shí)現(xiàn)的IDriver類(lèi)型)full.classname.of.Driver (如果是自定義的NHibernate外部的IDriver實(shí)現(xiàn)類(lèi) )full.classname.of.Driver, assembly。
這個(gè)配置通常是不需要配置的,如果設(shè)置好了hibernate.dialect一般會(huì)自動(dòng)選好對(duì)應(yīng)的IDriver。 詳細(xì)的dialect與IDriver的默認(rèn)對(duì)應(yīng)關(guān)系可以查看API文檔。
例如: Chaos, ReadCommitted, ReadUncommitted, RepeatableRead, Serializable, Unspecified
例如: auto (默認(rèn)) | on_close | after_transaction
注意,這些設(shè)置僅對(duì)通過(guò)ISessionFactory.OpenSession得到的ISession起作用。對(duì)于通過(guò)ISessionFactory.GetCurrentSession得到的ISession, 所配置的ICurrentSessionContext實(shí)現(xiàn)控制這些ISession的連接釋放模式。 請(qǐng)參閱2.3。上下文相關(guān)的(Contextual) Session獲取更多信息。
下面是一個(gè)如何在web.config里如何設(shè)置數(shù)據(jù)庫(kù)連接屬性的例子:
1 <configuration> 2 <configSections> 3 <section name="hibernate-configuration" 4 type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate" /> 5 </configSections> 6 7 <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2"> 8 <session-factory> 9 <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider, NHibernate</property> 10 <property name="connection.connection_string"> 11 Server=127.0.0.1; Initial Catalog=thedatabase; Integrated Security=SSPI 12 </property> 13 <property name="dialect">NHibernate.Dialect.MsSql2000Dialect</property> 14 <property name="current_session_context_class">managed_web</property> 15 </session-factory> 16 </hibernate-configuration> 17 <!-- other app specific config follows --> 18 19 </configuration>
NHibernate依賴的ADO.NET自己實(shí)現(xiàn)的數(shù)據(jù)庫(kù)連接池。
你也可以通過(guò)實(shí)現(xiàn)NHibernate.Connection.IConnectionProvider接口來(lái)自己定義ADO.NET連接獲取策略, 你也可以通過(guò)設(shè)置connection.provider_class來(lái)更換數(shù)據(jù)庫(kù)連接獲取策略。
有大量屬性能用來(lái)控制NHibernate在運(yùn)行期的行為. 它們都是可選的, 并擁有適當(dāng)?shù)哪J(rèn)值.
警告: 其中一些屬性是"系統(tǒng)級(jí)(system-level)的",系統(tǒng)級(jí)屬性只能通過(guò)在代碼里設(shè)置NHibernate.Cfg.Environment類(lèi)的靜態(tài)屬性,或者在配置文件里的<hibernate-configuration>配置節(jié)里來(lái)設(shè)置, 而不能用Configuration.SetProperties方法來(lái)設(shè)置。
表 3.2. NHibernate配置屬性
可用值: full.classname.of.Dialect, assembly
可用值: SCHEMA_NAME
可用值: true | false
可用值:建議在0 到3之間取值。
可用值: null | lcg | codedom
可用值: classname.of.CacheProvider, assembly
可用值: classname.of.QueryCacheFactory, assembly
可用值: prefix
可用值: hqlLiteral=SQL_LITERAL, hqlFunction=SQLFUNC
可用值: create | create-drop
可用值: classname.of.TransactionFactory, assembly
你應(yīng)當(dāng)總是為你的數(shù)據(jù)庫(kù)將hibernate.dialect屬性設(shè)置成正確的 NHibernate.Dialect.Dialect子類(lèi).
不過(guò)這并不是要嚴(yán)格執(zhí)行的除非你帶算使用 native或者是sequence主鍵生成策略或者是悲觀鎖定 (例如使用ISession.Lock()或者是IQuery.SetLockMode()), 如果你指定一種方言, NHibernate將為上面列出的一些屬性使用合理的默認(rèn)值, 為你省去了手工指定它們的功夫.
表 3.3. NHibernate SQL 方言 (hibernate.dialect)
其他可用的方言都包含在NHibernate Contrib項(xiàng)目中,(請(qǐng)參閱《I. NHibernateContrib 參考文檔》)?,F(xiàn)在這個(gè)項(xiàng)目里僅僅包含Microsoft Access (Jet)數(shù)據(jù)庫(kù)方言.
如果你的數(shù)據(jù)庫(kù)支持ANSI, Oracle或Sybase風(fēng)格的外連接, 外連接抓取通常能通過(guò)限制往返數(shù)據(jù)庫(kù)次數(shù) (更多的工作交由數(shù)據(jù)庫(kù)自己來(lái)完成)來(lái)提高效率. 外連接抓取允許在單個(gè)SELECTSQL語(yǔ)句中, 通過(guò)many-to-one, one-to-many, many-to-many和one-to-one關(guān)聯(lián)獲取連接對(duì)象的整個(gè)對(duì)象圖.
默認(rèn)情況下,抓取在葉子對(duì)象,集合類(lèi),擁有代理的對(duì)象或者產(chǎn)生對(duì)自身的循環(huán)引用時(shí)終止。
對(duì)于部分關(guān)聯(lián)(particular association),可以通過(guò)設(shè)置 fetch來(lái)配置(默認(rèn)行為會(huì)被覆蓋)。
將hibernate.max_fetch_depth設(shè)為0能在全局范圍內(nèi)禁止外連接抓取. 設(shè)為1 或更高值能啟用one-to-one和many-to-oneouter關(guān)聯(lián)的外連接抓取, 它們通過(guò)fetch="join"來(lái)映射.
具體信息請(qǐng)參閱《16.1. 抓取策略(Fetching strategies) 》
在NHibernate 1.0里,outer-join具備同樣的功效,這個(gè)標(biāo)簽現(xiàn)在已經(jīng)過(guò)期了,取而代之的是 fetch標(biāo)簽。
你可以通過(guò)實(shí)現(xiàn)NHibernate.Cache.ICacheProvider接口來(lái)集成一個(gè)使用進(jìn)程或群集范圍內(nèi)的二級(jí)緩存系統(tǒng)。
你可以通過(guò)設(shè)置cache.provider_class來(lái)選擇緩存的實(shí)現(xiàn)。 請(qǐng)參閱《16.2. 二級(jí)緩存(The Second Level Cache)》。
你可以使用hibernate.query.substitutions在NHibernate中定義新的查詢符號(hào). 例如:
1 query.substitutions true=1, false=0
將導(dǎo)致符號(hào)true和false在生成的SQL中被翻譯成整數(shù)常量.
1 query.substitutions toLowercase=LOWER
將允許你重命名SQL中的LOWER函數(shù).
NHibernate使用Apache log4net來(lái)為各種事件記錄日志。
你可以從http://logging./log4net/下載log4net。 你需要在應(yīng)用程序配置文件添加一個(gè)log4net配置節(jié)用于配置log4net。
NHibernate的源代碼分發(fā)包里有一個(gè)示例配置文件,位置在src/NHibernate.Test。
我們強(qiáng)烈建議你熟悉一下NHibernate的日志消息. 在不失可讀性的前提下, 我們做了很多工作, 使NHibernate的日志可能地詳細(xì)。
這是必要的查錯(cuò)利器。 當(dāng)你遇到問(wèn)題的時(shí)候不要忘了設(shè)置show_sql開(kāi)啟SQL日志。
NHibernate.Cfg.INamingStrategy接口允許你為數(shù)據(jù)庫(kù)中的對(duì)象和schema 元素指定一個(gè)“命名標(biāo)準(zhǔn)”.
這個(gè)特性有助于減少冗長(zhǎng)的映射定義文件. (例如:TBL_ 前綴). NHibernate默認(rèn)是最小化實(shí)現(xiàn)。
在加入映射定義前,你可以調(diào)用 Configuration.SetNamingStrategy()指定一個(gè)不同的命名策略:
1 ISessionFactory sf = new Configuration() 2 .SetNamingStrategy(ImprovedNamingStrategy.Instance) 3 .AddFile("Item.hbm.xml") 4 .AddFile("Bid.hbm.xml") 5 .BuildSessionFactory();
NHibernate.Cfg.ImprovedNamingStrategy是一個(gè)內(nèi)建的命名策略, 對(duì)一些應(yīng)用程序而言,可能是非常有用的起點(diǎn).
另一個(gè)配置方法是在hibernate.cfg.xml文件中指定一套完整的配置. 這個(gè)文件可以當(dāng)成配置文件中的 <nhibernate;>和<hibernate-configuration>配置節(jié)的替代。
XML配置文件默認(rèn)放在應(yīng)用程序的根目錄下。下面是一個(gè)例子:
1 <?xml version='1.0' encoding='utf-8'?>; 2 <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2"> 3 <session-factory> 4 <!-- properties --> 5 <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property> 6 <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property> 7 <property name="connection.connection_string">Server=localhost;initial catalog=nhibernate;User Id=;Password=</property> 8 <property name="show_sql">false</property> 9 <property name="dialect">NHibernate.Dialect.MsSql2005Dialect</property> 10 <property name="use_outer_join">true</property> 11 12 <!-- mapping files --> 13 <mapping resource="NHibernate.Auction.Item.hbm.xml" assembly="NHibernate.Auction" /> 14 <mapping resource="NHibernate.Auction.Bid.hbm.xml" assembly="NHibernate.Auction" /> 15 </session-factory> 16 /hibernate-configuration>
使用XML配置,使得啟動(dòng)NHibernate變的異常簡(jiǎn)單, 如下所示,一行代碼就可以搞定:
1 ISessionFactory sf = new Configuration().Configure().BuildSessionFactory();
你可以使用如下代碼來(lái)添加一個(gè)不同的XML配置文件
1 ISessionFactory sf = new Configuration() 2 .Configure("/path/to/config.cfg.xml") 3 .BuildSessionFactory();
來(lái)自: 昵稱10504424 > 《工作》
0條評(píng)論
發(fā)表
請(qǐng)遵守用戶 評(píng)論公約
[NHibernate]基本配置與測(cè)試
[NHibernate]基本配置與測(cè)試目錄。Data.dll provider for SQL Server --> 8 <hibernate-configuration xmlns="urn:nhibernat...
CSDN 文檔中心:Hibernate訪問(wèn)多個(gè)數(shù)據(jù)庫(kù)
如果該文件存在,configure()方法會(huì)首先訪問(wèn)<session-factory>,并獲取該元素name的屬性,如果name的屬性非空,將用這個(gè)配置的值來(lái)覆蓋hibernate.properties的hibernate.session_factory_name的配置...
ANT+Xdoclet自動(dòng)生成Hibernate配置文件\映射文件(正確)
Hibernate的配置文件
Hibernate的配置文件。附錄:常見(jiàn)的數(shù)據(jù)庫(kù)方言DB2 :org.hibernate.dialect.DB2Dialect MySQL :org.hibernate.dialect.MySQLDialect Oracle (any version) :org.hibernate.dialect.OracleDialect Ora...
hibernate問(wèn)題集錦
MappingException: Error reading resource: hibernate/Hello_Bean.hbm.xml 如果出現(xiàn)這行錯(cuò)誤說(shuō)明你的hibernate的XML配置文件有錯(cuò)\r net.sf.hibernate.MappingException: Resource: hibernate/Hello_Be...
Hibernate工作原理
通過(guò)上圖能夠發(fā)現(xiàn)HIbernate需要一個(gè)hibernate.properties文件,該文件用于配置Hibernate和數(shù)據(jù)庫(kù)連接的信息。第二種是使用hibernate.cfg...
利用Eclipse開(kāi)發(fā)Hibernate應(yīng)用程序
利用Eclipse開(kāi)發(fā)Hibernate應(yīng)用程序。注意加入Hibernate的所有l(wèi)ib文件,包括有Hibernate下面的hibernate2.jar和lib目錄下面的所有.jar文...
NHibernate Step by Step
提示:為了在VS2005IDE中獲得NHibernate配置文件的代碼提示,請(qǐng)將你的$NHibernate\src\NHibernate下的nhibernate-configuration-2.0.xsd、nhibernate-mapping-2.0.xsd拷貝到\Program Files\Microsoft V...
NHibernate使用之詳細(xì)圖解
本文檔適合初級(jí)開(kāi)發(fā)者或者是第一次接觸NHibernate框架的朋友,其中NHibernate不是最新的版本,但是一個(gè)比較經(jīng)典的版本 NHibernate 2.1.2...
微信掃碼,在手機(jī)上查看選中內(nèi)容