Chinaunix首页 | 论坛 | 博客
  • 博客访问: 191743
  • 博文数量: 11
  • 博客积分: 3010
  • 博客等级: 中校
  • 技术积分: 855
  • 用 户 组: 普通用户
  • 注册时间: 2007-07-16 16:26
文章分类
文章存档

2011年(1)

2010年(1)

2009年(2)

2008年(7)

我的朋友
最近访客

分类:

2008-03-02 00:48:55

一:NHibernate简介:

  NHibernate是基于Microsoft VisualStudio.Net的O/R Mapping持久框架,它从基于Java的Hibernate项目移植过来。O/R Mapping就是把对象到映射关系数据库的记录。简单的说就是能实现把一个对象存储为数据表中的一条记录和由一条记录创建一个相应的对象,数据表中的数据就是对象的属性。

  NHibernate与传统的DataSet/DataTable的不同,首先表现在设计上的不同,当使用O/R Mapping时,更多的是从对象的角度设计程序,而把数据(对象的属性)存储的细节放在后面,可以完全采用面向对象(00)的方式来设计,而在使用DataSet/DataTable时,它只是存放数据的对象,看起来更像一个数据表,不能直观地表达业务概念。NHibernate用于把你的.NET对象持久化到底层的关系数据库中,你完全不用自己编写SQL语句去操作这些对象,NHibernate会替代你做这些工作。你的代码里面只需要关心这些对象,NHibernate生成SQL语句并能为你取到正确的东西。

二:NHibernate主要接口的介绍

   ISession: 是面向用户的主要接口,主要用于对象持久化,数据加载等操作,支持数据库事务,它隐藏了NHibernate内部复杂的实现细节,ISession由ISessionFactory创建。

   ISessionFactory:是NHibernate内部的核心类,它维护到持久机制(数据库)的连接并对它们进行管理,同时还会保存所有持久对象的映射信息。

   ISessionFactory由Configuration创建,因为创建ISessionFactory的开销非常大(需要加载映射信息),所以这个对象一般使用Singleton(单例)模式。

   ITransaction:是NHibernate的事务处理接口,它只是简单地封闭了底层的数据库事务。事务必须由ISession来启动。

   ICriteria:是Expression(表达式)数据加载接口,Expression是一个关系表达式组合,通过它能产生SQL语句的Where部分,用户需要通过ISession来间接调用它。

   IQuery:是HQL数据加载接口,HQL(Hibernate Query Language)是NHibernate专用的面向对象的数据查询语言,它与数据库的SQL有些类似,但功能更强大。同ICriteria一样,也需要通过ISession来间接调用它。

   Session类:封装了NHibernate中的ISession和ISessionFactory两个接口,Session类的属性和方法都是静态的,它有一个Factory属性,用于返回ISessionFactory,有一个GetSession方法,用于取得一个新的ISession.

三:应用的步骤

1.       在数据库中创建把.Net类持久化的对应表.
2.       创建需要被持久化的.Net类.
3.       创建映射文件,以告诉NH怎样持久化这些类的属性.
4.       创建NH的配置文件,以告诉NH怎样连接数据库.
5.       使用NH提供的API.

步骤1:创建数据库表
我们正在做的是一个非常简单的NH示例.在这个例子里面,我们实现一个基本的用户管理子系统.我们将会使用一个user表(sql server 2000):
 
use NHibernate
go
 
CREATE TABLE users (
  LogonID varchar(20) NOT NULL default '0',
  Name varchar(40) default NULL,
  Password varchar(20) default NULL,
  EmailAddress varchar(40) default NULL,
  LastLogon datetime default NULL,
  PRIMARY KEY  (LogonID)
)
go
 
我使用的是MS Sql Server 2000,但是如果你找到一个任何数据库的.net Data Provider驱动,你可以使用任何数据库.
 
步骤2:创建.Net类:
当我们这样一堆的用户的时候,我们需要某种对象来保存.NH是通过reflection对象的属性来工作的,所以我们给需要持久化的对象添加属性.一个对应于上面数据库结构的类可以写成这个样子:
 
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-NH并不要求一定要这样做.你可以使用public,protected,internal或者干脆private来标记你的属性.
 
步骤3:编写映射文件(Mapping File)
现在我们有了数据库表和.Net类,我们还需要告诉NH怎样在数据库和类之间映射.这就需要映射文件了.最简捷(也是可维护性最好的)方法就是为每一个类编写一个映射文件,如果你把命名为"XXX.hbm.xml"的映射文件和XXX类文件放在同一目录下,NH会很让 一切变得很轻松.这儿,我们的User.hbm.xml可能会像这样:
注意:实体类的映射文件以.hbm.xml做为后辍,确记得把映射文件的Build Action属性设为:Embedded Resource,若则会出错,确记确记!

| | | | |
阅读(1465) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:NHibernate错误集锦及配置技巧

给主人留下些什么吧!~~