免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
NHibernate快速指南(翻譯

NHibernate快速指南

 

什么是NHibernate

 

NHibernate 是一個(gè)基于.Net 的針對(duì)關(guān)系型數(shù)據(jù)庫(kù)的對(duì)象持久化類庫(kù)。Nhibernate 來(lái)源于非常優(yōu)秀的基于JavaHibernate 關(guān)系型持久化工具。

NHibernate 從數(shù)據(jù)庫(kù)底層來(lái)持久化你的.Net 對(duì)象到關(guān)系型數(shù)據(jù)庫(kù)。NHibernate 為你處理這些,遠(yuǎn)勝于你不得不寫(xiě)SQL去從數(shù)據(jù)庫(kù)存取對(duì)象。你的代碼僅僅和對(duì)象關(guān)聯(lián),NHibernat 自動(dòng)產(chǎn)生SQL語(yǔ)句,并確保對(duì)象提交到正確的表和字段中去。

 

為什么寫(xiě)這個(gè)指南

 

任何熟悉Hibernate的人會(huì)發(fā)現(xiàn)這篇指南和Glen Smith A Hitchhiker‘s Guide to Hibernate 非常相近。這里的內(nèi)容正是基于他的指南,因此所有的感謝都應(yīng)該給與他。

NHibernate的文檔并非每處都和Hibernate的文檔一致。然而,項(xiàng)目的相似應(yīng)該能使讀者通過(guò)讀Hibernate的文檔來(lái)很好的理解NHibernate如何工作。

這篇文檔意在讓你盡可能快的開(kāi)始使用NHibernate。它將介紹如何持久化一個(gè)簡(jiǎn)單的對(duì)象到一張表里。想得到更多的復(fù)雜的例子,可以參考NUnit測(cè)試及附帶代碼。

 

開(kāi)發(fā)的過(guò)程

 

Nhibernate未來(lái)將會(huì)提供一些工具幫助你自動(dòng)產(chǎn)生schema文件(現(xiàn)在還是基于代碼)或是通過(guò)映射文件產(chǎn)生類(在籌措階段)或是更新schema(來(lái)自于一個(gè)新開(kāi)發(fā)者的建議)。然而,這里我們的例子是假定一切來(lái)自于完全手寫(xiě),包括設(shè)置表和.Net類的編寫(xiě)。我們將進(jìn)行以下步驟。

1.新建一個(gè)將要持久化.Net對(duì)象的表

2.構(gòu)建一個(gè)需要被持久化的.Net

3.構(gòu)建一個(gè)可以讓NHibernate知道如何持久化對(duì)象屬性的映射文件

4.構(gòu)建一個(gè)讓NHibernate知道如何連接數(shù)據(jù)庫(kù)的配置文件]

5.使用NHibernateAPI

 

第一步:寫(xiě)構(gòu)建表的SQL

 

這里我們將使用的是一個(gè)非常簡(jiǎn)單的例子。假設(shè)你正在為你的網(wǎng)站開(kāi)發(fā)一個(gè)基本的用戶管理子系統(tǒng)。我們將使用如下的一張User表(假定你已經(jīng)設(shè)置好一個(gè)數(shù)據(jù)庫(kù)在的例子里我稱它為NHibernate)。

 

 

               
use NHibernate
go
 
CREATE TABLE users (
  LogonID nvarchar(20) NOT NULL default ‘0‘,
  Name nvarchar(40) default NULL,
  Password nvarchar(20) default NULL,
  EmailAddress nvarchar(40) default NULL,
  LastLogon datetime default NULL,
  PRIMARY KEY  (LogonID)
)
go

我使用的是MS Sql Server 2000, 但也可以使用任何數(shù)據(jù)庫(kù),只要你有關(guān)于它們的基于.Net數(shù)據(jù)提供驅(qū)動(dòng)程序。我們將得到一個(gè)含有LogonID,Name, Password, Email LastLogon的表. 經(jīng)過(guò)以上標(biāo)準(zhǔn)步驟,我們下一步是寫(xiě)一個(gè).Net類處理一個(gè)給定的User對(duì)象。

第二步:產(chǎn)生一個(gè).Net 類文件

 

當(dāng)內(nèi)存中有一堆User對(duì)象的時(shí)候,我們需要某種對(duì)象去保存它們。NHibernate通過(guò)對(duì)象屬性的反射來(lái)工作,因此我們需要添加我們希望持久化的對(duì)象屬性。一個(gè)可以被NHibernate持久化的類應(yīng)該看起來(lái)象下面的樣子:

               
using System;
 
namespace NHibernate.Demo.QuickStart
{
        public class User
        {
               private string id;
               private string userName;
               private string password;
               private string emailAddress;
               private DateTime lastLogon;
 
 
               public User()
               {
               }
 
               public string Id 
               {
                       get { return id; }
                       set { id = value; }
               }
 
               public string UserName 
               {
                       get { return userName; }
                       set { userName = value; }
               }
 
               public string Password 
               {
                       get { return password; }
                       set { password = value; }
               }
 
               public string EmailAddress 
               {
                       get { return emailAddress; }
                       set { emailAddress = value; }
               }
 
               public DateTime LastLogon 
               {
                       get { return lastLogon; }
                       set { lastLogon = value; }
               }
               
        }
}

在上面的例子里,我們的屬性和構(gòu)建函數(shù) public,但這個(gè)對(duì)NHibernate不是必要的.它可以使用public, protected, internal或者甚至是用private來(lái)持久化數(shù)據(jù)。

 

第三步:寫(xiě)映射文件

現(xiàn)在我們有數(shù)據(jù)表和需要去映射它的.Net類。我們需要一種方式去讓NHibernate知道如何從一個(gè)映射到另一個(gè)。這個(gè)任務(wù)依賴于映射文件來(lái)完成。最易于管理的辦法是為每一個(gè)類寫(xiě)一個(gè)映射文件,如果你命名它是YourObject.hbm.xml 并且把它放在和類的同一個(gè)目錄里,NHiberante將會(huì)使得事情簡(jiǎn)單起來(lái)。下面是一個(gè)User.hbm.xml的例子:

               
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">
        <class name="NHibernate.Examples.QuickStart.User, NHibernate.Examples" table="users">
               <id name="Id" column="LogonId" type="String" length="20"> 
                       <generator class="assigned" /> 
               </id> 
               <property name="UserName" column= "Name" type="String" length="40"/> 
               <property name="Password" type="String" length="20"/> 
               <property name="EmailAddress" type="String" length="40"/>
               <property name="LastLogon" type="DateTime"/>
        </class>
 
</hibernate-mapping>
               

讓我們來(lái)看看這個(gè)文件中讓我們感興趣的某些行。第一個(gè)有趣的標(biāo)簽是class。這里我們將映射類型名稱(類名和裝配件)到我們數(shù)據(jù)庫(kù)中的User表,這里和Hibernate有一點(diǎn)點(diǎn)的不同。你將不得不告訴NHibernate從何處提取對(duì)象。在這個(gè)例子里我們從裝配件NHibernate.Examples裝載類NHibernate.Examples.QuickStart.User 。NHibernate 遵循和.Net Framework同樣的規(guī)則來(lái)加載類型。因此如果你在如何指定類型的方面有些混淆,請(qǐng)參看.Net Framework SDK。

讓我們先跳過(guò)id標(biāo)簽,來(lái)討論property標(biāo)簽。簡(jiǎn)要看一下,你將發(fā)現(xiàn)NHibernate所要做的工作。name屬性的值正是我們.Net 類的屬性,column屬性值將是我們數(shù)據(jù)庫(kù)里的字段。type屬性是可選的(如果你不標(biāo)明,NHibernate將利用反射進(jìn)行最佳的推測(cè))。

好了,讓我們回到標(biāo)簽id, 你可以猜測(cè)到這個(gè)標(biāo)簽將是映射數(shù)據(jù)庫(kù)表的主鍵,的確如此,id標(biāo)簽的組成和我們剛才看的property標(biāo)簽是相似的。我們映射屬性到目標(biāo)數(shù)據(jù)庫(kù)的字段。

內(nèi)嵌的generator 標(biāo)簽告訴NHibernate 如何生成主鍵(它將恰當(dāng)?shù)臑槟闵芍麈I,不管你指定何種類型,但你必須告訴它)。在我們的例子里,我們?cè)O(shè)定為assigned,意味著我們對(duì)象將自己生成主鍵(畢竟User對(duì)象常常需要一個(gè)UserID)。如果你執(zhí)意要NHiberante為你生成主鍵,你感興趣于設(shè)定uuid.hexuuid.string(從文檔中獲取更多信息)

 

提示:如果你使用Visual Studio.Net 去編譯的話,請(qǐng)將user.hbm.xmlBuild Action屬性設(shè)置為Embedded Resource。映射文件將成為裝配件的一部分。更詳細(xì)的細(xì)節(jié)重點(diǎn)將在后面展示。

提示:如果你僅僅是改變映射文件,你不能使用build 而應(yīng)該Rebuild項(xiàng)目。Visual Studio.Net 不會(huì)重新編譯有改變的映射文件。

 

第四步:為你的數(shù)據(jù)庫(kù)產(chǎn)生一個(gè)配置文件

我們至今還沒(méi)有告訴NHibernate 去哪里連接數(shù)據(jù)庫(kù)。最直接的辦法是在你的應(yīng)用程序的配置文件里設(shè)置一個(gè)NHibernate配置節(jié)。這和在Hibernate里使用屬性文件是等價(jià)的。如下配置:

               
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
        <configSections>
               <section name="nhibernate" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.3300.0,Culture=neutral, PublicKeyToken=b77a5c561934e089" />
        </configSections>
        
        <nhibernate>
               <add 
                       key="hibernate.connection.provider"          
                       value="NHibernate.Connection.DriverConnectionProvider" 
               />
               <add 
                       key="hibernate.dialect"                      
                       value="NHibernate.Dialect.MsSql2000Dialect" 
               />
               <add 
                       key="hibernate.connection.driver_class"          
                       value="NHibernate.Driver.SqlClientDriver" 
               />
               <add 
                       key="hibernate.connection.connection_string" 
                       value="Server=localhost;initial catalog=nhibernate;Integrated Security=SSPI" 
               />
        </nhibernate>
</configuration>
               

上面的例子里用了SqlClient 驅(qū)動(dòng),在本地連接名稱為NHibernate 的數(shù)據(jù)庫(kù),提供用戶名和密碼。那里有一堆屬性你需要調(diào)整來(lái)確定如何讓NHibernate來(lái)訪問(wèn)數(shù)據(jù)庫(kù)。再次說(shuō)明,你可以在文檔里獲取更多信息。

請(qǐng)注意以上的配置里并沒(méi)有涉及到log4net的配置信息。NHibernate使用log4net來(lái)記錄內(nèi)部發(fā)生的一切。在一個(gè)應(yīng)用程序產(chǎn)品里,在你特定環(huán)境里,我推薦配置log4net,并為NHibernate設(shè)置一定的日志級(jí)別。

第五步:開(kāi)始展現(xiàn)NHibernate的魔力

 

所有艱苦的工作已經(jīng)完成。你將有以下內(nèi)容

User.cs ----你需要持久化的C#

User.hbm.xml ----你的NHibernate映射文件

App.config ---對(duì)ADO.NET連接的配置信息(如果你愿意,你可以在代碼中實(shí)現(xiàn))。

你的數(shù)據(jù)庫(kù)里有一張User表。

 

現(xiàn)在可以在你的代碼中恰當(dāng)簡(jiǎn)潔的使用NHibernate。簡(jiǎn)化的版本如下

  1. 創(chuàng)建一個(gè)Configuration對(duì)象
  2. Configuration知道你將存儲(chǔ)何種類型的對(duì)象
  3. 為你選擇的數(shù)據(jù)庫(kù)創(chuàng)建一個(gè)Session對(duì)象
  4. LoadSaveQuery你的對(duì)象
  5. 通過(guò)SessionFlush()方法將對(duì)象提交給數(shù)據(jù)庫(kù)。

 

為了讓你更清晰,我們來(lái)看一些代碼。

首先,創(chuàng)建一個(gè)Configuration對(duì)象

Configuration對(duì)象能夠解析所有.Net對(duì)象和后臺(tái)數(shù)據(jù)庫(kù)中的映射關(guān)系。

 

               
        Configuration cfg = new Configuration();
        cfg.AddAssembly("NHibernate.Examples");
               

Configuration對(duì)象會(huì)搜索裝配件里的任何以hbm.xml 結(jié)尾的文件。還有其他方法加載映射文件,但這種方式是最簡(jiǎn)單的。

下一步,創(chuàng)建一個(gè)Session對(duì)象

ISession對(duì)象提供一個(gè)到后臺(tái)數(shù)據(jù)庫(kù)的連接,ITransaction對(duì)象提供一個(gè)可以被NHibernate管理的事務(wù)。

 

               
        ISessionFactory factory = cfg.BuildSessionFactory();
        ISession session = factory.OpenSession();
        ITransaction transaction = session.BeginTransaction();
               

 

接著來(lái)Load, SaveQuery你的對(duì)象

現(xiàn)在你可以用使用傳統(tǒng)的.Net方法來(lái)操縱對(duì)象。你想保存一個(gè)新對(duì)象到數(shù)據(jù)庫(kù)嗎?嘗試下面的方法:

               
        User newUser = new User();
        newUser.Id = "joe_cool";
        newUser.UserName = "Joseph Cool";
        newUser.Password = "abc123";
        newUser.EmailAddress = "joe@cool.com";
        newUser.LastLogon = DateTime.Now;
                       
        // Tell NHibernate that this object should be saved
        session.Save(newUser);
 
        // commit all of the changes to the DB and close the ISession
        transaction.Commit();
        session.Close();

 

正如你所看到的,關(guān)于NHiberante重要的事情是如此簡(jiǎn)單。繼續(xù)并且查詢你的數(shù)據(jù)庫(kù),驗(yàn)證一下User表里的新記錄。現(xiàn)在重要的事情就是你去操心業(yè)務(wù)對(duì)象并在進(jìn)行處理的時(shí)候告訴NHibernate就可以了。

 

讓我們來(lái)告訴你,當(dāng)你有一個(gè)UserID的時(shí)候如何獲取對(duì)象(舉例說(shuō),登陸你的網(wǎng)站的時(shí)候)。僅僅一句話就可以打開(kāi)Session,傳入key就可以了

 

               
        // open another session to retrieve the just inserted user
        session = factory.OpenSession();
 
        User joeCool = (User)session.Load(typeof(User), "joe_cool");
               

 

你所獲取的User對(duì)象還在生存周期內(nèi)!改變它的屬性,并通過(guò)Flush()持久化到數(shù)據(jù)庫(kù)。

               
        // set Joe Cool‘s Last Login property
        joeCool.LastLogon = DateTime.Now;
 
        // flush the changes from the Session to the Database
        session.Flush();
               

 

 

你所要做的就是通過(guò)NHibernate來(lái)進(jìn)行你需要的改變,并調(diào)用SessionFlush()方法提交。驗(yàn)證一下數(shù)據(jù)庫(kù),查查用戶ID”joe_cool”的記錄中”LastLogon”的更改。

 

還有更好的,你可以以System.Collections.IList的方式來(lái)獲取從表中的對(duì)象。如下

               
        IList userList = session.CreateCriteria(typeof(User)).List();
        foreach(User user in userList)
        {
               System.Diagnostics.Debug.WriteLine(user.Id + " last logged in at " + user.LastLogon);
        }
 
這個(gè)查詢將會(huì)返回所有表記錄。往往你需要做更多的控制,比如說(shuō)獲取從March 14, 2004 10:00 PM 以后登陸的用戶,如下:
               
        IList recentUsers = session.CreateCriteria(typeof(User))
                                      .Add(Expression.Expression.Gt("LastLogon", new DateTime(2004, 03, 14, 20, 0, 0)))
                                      .List();
 
        foreach(User user in recentUsers)
        {
               System.Diagnostics.Debug.WriteLine(user.Id + " last logged in at " + user.LastLogon);
        }
               
 
文檔里還有一堆健壯的查詢方式讓你調(diào)用,這里僅僅讓你對(duì)NHibernate所提供的強(qiáng)有力的工具有一定的了解。
        
最后調(diào)用Session對(duì)象的Close()方法,釋放NHibernate所使用的ADO.Net連接資源
 
               
        // tell NHibernate to close this Session
        session.Close();
               
 

 

更確切地說(shuō)

 

你已經(jīng)完成創(chuàng)建對(duì)象,持久化并通過(guò)條件查詢或鍵值查詢來(lái)返回它。相信你已經(jīng)從中獲得快樂(lè)。

現(xiàn)在你對(duì)NHibernate有了大致的了解,如果你能仔細(xì)閱讀大量來(lái)自Hibernate 2.0.3文檔,你將獲得幫助(NHibernate文檔還在早期階段,現(xiàn)在還僅僅是對(duì)Hibernate的拷貝)。

 

Enjoy! And Happy NHibernating!

Mike Doerfler

 

再次說(shuō)明,所有的權(quán)利來(lái)自Glen SmithA Hitchhiker‘s Guide to Hibernate

 

 

Translated by:  Jason Xie

Published: 2005-02-24

 

 

 

 

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開(kāi)APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
NHibernate Quick Start Guide
博客園 - Terrylee的技術(shù)專欄 - 基于NHibernate的三層結(jié)構(gòu)應(yīng)用程序開(kāi)發(fā)初步
c#開(kāi)源利器:NHibernate-ITPUB技術(shù)門戶
Hibernate 知識(shí)點(diǎn)小結(jié)
Hibernate中Could not synchronize database state with session問(wèn)題
關(guān)于POJO及DAO
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服