NHibernate快速指南

 
NHibernate 快速指南
 
什么是 NHibernate
 
NHibernate 是一个基于 .Net 的针对关系型数据库的对象持久化类库。 Nhibernate 来源于非常优秀的基于 Java Hibernate 关系型持久化工具。
NHibernate 从数据库底层来持久化你的 .Net 对象到关系型数据库。 NHibernate 为你处理这些,远胜于你不得不写 SQL 去从数据库存取对象。你的代码仅仅和对象关联, NHibernat 自动产生 SQL 语句,并确保对象提交到正确的表和字段中去。
 
为什么写这个指南
 
任何熟悉 Hibernate 的人会发现这篇指南和 Glen Smith A Hitchhiker's Guide to Hibernate 非常相近。这里的内容正是基于他的指南,因此所有的感谢都应该给与他。
NHibernate 的文档并非每处都和 Hibernate 的文档一致。然而,项目的相似应该能使读者通过读 Hibernate 的文档来很好的理解 NHibernate 如何工作。
这篇文档意在让你尽可能快的开始使用 NHibernate 。它将介绍如何持久化一个简单的对象到一张表里。想得到更多的复杂的例子,可以参考 NUnit 测试及附带代码。
 
开发的过程
 
Nhibernate 未来将会提供一些工具帮助你自动产生 schema 文件(现在还是基于代码)或是通过映射文件产生类(在筹措阶段)或是更新 schema( 来自于一个新开发者的建议 ) 。然而,这里我们的例子是假定一切来自于完全手写,包括设置表和 .Net 类的编写。我们将进行以下步骤。
1. 新建一个将要持久化 .Net 对象的表
2. 构建一个需要被持久化的 .Net
3. 构建一个可以让 NHibernate 知道如何持久化对象属性的映射文件
4. 构建一个让 NHibernate 知道如何连接数据库的配置文件 ]
5. 使用 NHibernate API
 
第一步:写构建表的 SQL
 
这里我们将使用的是一个非常简单的例子。假设你正在为你的网站开发一个基本的用户管理子系统。我们将使用如下的一张 User 表(假定你已经设置好一个数据库 在的例子里我称它为 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, 但也可以使用任何数据库,只要你有关于它们的基于 .Net 数据提供驱动程序。我们将得到一个含有 LogonID,Name, Password, Email LastLogon 的表 . 经过以上标准步骤,我们下一步是写一个 .Net 类处理一个给定的 User 对象。
第二步 : 产生一个 .Net 类文件
 
当内存中有一堆 User 对象的时候,我们需要某种对象去保存它们。 NHibernate 通过对象属性的反射来工作,因此我们需要添加我们希望持久化的对象属性。一个可以被 NHibernate 持久化的类应该看起来象下面的样子:
              
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; }
               }
              
        }
}
在上面的例子里,我们的属性和构建函数 public ,但这个对 NHibernate 不是必要的 . 它可以使用 public, protected, internal 或者甚至是用 private 来持久化数据。
 
第三步:写映射文件
现在我们有数据表和需要去映射它的 .Net 类。我们需要一种方式去让 NHibernate 知道如何从一个映射到另一个。这个任务依赖于映射文件来完成。最易于管理的办法是为每一个类写一个映射文件,如果你命名它是 YourObject.hbm.xml 并且把它放在和类的同一个目录里, NHiberante 将会使得事情简单起来。下面是一个 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>
              
让我们来看看这个文件中让我们感兴趣的某些行。第一个有趣的标签是 class 。这里我们将映射类型名称 ( 类名和装配件 ) 到我们数据库中的 User 表,这里和 Hibernate 有一点点的不同。你将不得不告诉 NHibernate 从何处提取对象。在这个例子里我们从装配件 NHibernate.Examples 装载类 NHibernate.Examples.QuickStart.User NHibernate 遵循和 .Net Framework 同样的规则来加载类型。因此如果你在如何指定类型的方面有些混淆,请参看 .Net Framework SDK
让我们先跳过 id 标签,来讨论 property 标签。简要看一下,你将发现 NHibernate 所要做的工作。 name 属性的值正是我们 .Net 类的属性, column 属性值将是我们数据库里的字段。 type 属性是可选的(如果你不标明, NHibernate 将利用反射进行最佳的推测)。
好了,让我们回到标签 id, 你可以猜测到这个标签将是映射数据库表的主键,的确如此, id 标签的组成和我们刚才看的 property 标签是相似的。我们映射属性到目标数据库的字段。
内嵌的 generator 标签告诉 NHibernate 如何生成主键(它将恰当的为你生成主键,不管你指定何种类型,但你必须告诉它)。在我们的例子里,我们设定为 assigned, 意味着我们对象将自己生成主键(毕竟 User 对象常常需要一个 UserID )。如果你执意要 NHiberante 为你生成主键,你感兴趣于设定 uuid.hex uuid.string (从文档中获取更多信息)
 
提示:如果你使用 Visual Studio.Net 去编译的话,请将 user.hbm.xml Build Action 属性设置为 Embedded Resource 。映射文件将成为装配件的一部分。更详细的细节重点将在后面展示
提示:如果你仅仅是改变映射文件,你不能使用 build 而应该 Rebuild 项目。 Visual Studio.Net 不会重新编译有改变的映射文件。
 
第四步:为你的数据库产生一个配置文件
我们至今还没有告诉 NHibernate 去哪里连接数据库。最直接的办法是在你的应用程序的配置文件里设置一个 NHibernate 配置节。这和在 Hibernate 里使用属性文件是等价的。如下配置:
              
<?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 驱动,在本地连接名称为 NHibernate 的数据库,提供用户名和密码。那里有一堆属性你需要调整来确定如何让 NHibernate 来访问数据库。再次说明,你可以在文档里获取更多信息。
请注意以上的配置里并没有涉及到 log4net 的配置信息。 NHibernate 使用 log4net 来记录内部发生的一切。在一个应用程序产品里,在你特定环境里,我推荐配置 log4net ,并为 NHibernate 设置一定的日志级别。
第五步:开始展现 NHibernate 的魔力
 
所有艰苦的工作已经完成。你将有以下内容
User.cs ---- 你需要持久化的 C#
User.hbm.xml ---- 你的 NHibernate 映射文件
App.config --- ADO.NET 连接的配置信息(如果你愿意,你可以在代码中实现)。
你的数据库里有一张 User 表。
 
现在可以在你的代码中恰当简洁的使用 NHibernate 。简化的版本如下
1.       创建一个 Configuration 对象
2.       Configuration 知道你将存储何种类型的对象
3.       为你选择的数据库创建一个 Session 对象
4.       Load Save Query 你的对象
5.       通过 Session Flush() 方法将对象提交给数据库。
 
为了让你更清晰,我们来看一些代码。
首先,创建一个 Configuration 对象
Configuration 对象能够解析所有 .Net 对象和后台数据库中的映射关系。
 
              
        Configuration cfg = new Configuration();
        cfg.AddAssembly("NHibernate.Examples");
              
Configuration 对象会搜索装配件里的任何以 hbm.xml  结尾的文件。还有其他方法加载映射文件,但这种方式是最简单的。
下一步,创建一个 Session 对象
ISession 对象提供一个到后台数据库的连接, ITransaction 对象提供一个可以被 NHibernate 管理的事务。
 
              
        ISessionFactory factory = cfg.BuildSessionFactory();
        ISession session = factory.OpenSession();
        ITransaction transaction = session.BeginTransaction();
              
 
接着来 Load, Save Query 你的对象
现在你可以用使用传统的 .Net 方法来操纵对象。你想保存一个新对象到数据库吗?尝试下面的方法:
              
        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();
 
正如你所看到的,关于 NHiberante 重要的事情是如此简单。继续并且查询你的数据库,验证一下 User 表里的新记录。现在重要的事情就是你去操心业务对象并在进行处理的时候告诉 NHibernate 就可以了。
 
让我们来告诉你,当你有一个 UserID 的时候如何获取对象(举例说,登陆你的网站的时候)。仅仅一句话就可以打开 Session ,传入 key 就可以了
 
              
        // open another session to retrieve the just inserted user
        session = factory.OpenSession();
 
        User joeCool = (User)session.Load(typeof(User), "joe_cool");
              
 
你所获取的 User 对象还在生存周期内!改变它的属性,并通过 Flush() 持久化到数据库。
              
        // set Joe Cool's Last Login property
        joeCool.LastLogon = DateTime.Now;
 
        // flush the changes from the Session to the Database
        session.Flush();
              
 
 
你所要做的就是通过 NHibernate 来进行你需要的改变,并调用 Session Flush() 方法提交。验证一下数据库,查查用户 ID ”joe_cool” 的记录中 ”LastLogon” 的更改。
 
还有更好的,你可以以 System.Collections.IList 的方式来获取从表中的对象。如下
              
         IList userList = session.CreateCriteria(typeof(User)).List();
         foreach(User user in userList)
         {
                 System.Diagnostics.Debug.WriteLine(user.Id + " last logged in at " + user.LastLogon);
         }
 
这个查询将会返回所有表记录。往往你需要做更多的控制,比如说获取从 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);
        }
              
 
文档里还有一堆健壮的查询方式让你调用,这里仅仅让你对 NHibernate 所提供的强有力的工具有一定的了解。
       
最后调用 Session 对象的 Close() 方法,释放 NHibernate 所使用的 ADO.Net 连接资源
 
              
        // tell NHibernate to close this Session
        session.Close();
              
 
 
更确切地说
 
你已经完成创建对象,持久化并通过条件查询或键值查询来返回它。相信你已经从中获得快乐。
现在你对 NHibernate 有了大致的了解,如果你能仔细阅读大量来自 Hibernate 2.0.3 文档 , 你将获得帮助( NHibernate 文档还在早期阶段,现在还仅仅是对 Hibernate 的拷贝)。
 
Enjoy! And Happy NHibernating!
Mike Doerfler
 
再次说明,所有的权利来自 Glen Smith A Hitchhiker's Guide to Hibernate
 
 
Translated by: Jason Xie
Published: 2005-02-24
 
 
 
 
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值