LinKejian's blog in cnbolgs

导航

(二)NHibernate QuickStart:单个对象与单个数据表的持久化


概述:
    本文演示了在单个对象需要持久化的过程,这是一个简单的演示,甚至不能用在任何项目中,但确实展示了NHibernate的威力。
    整个过程创建了一个类库,并用NUnit进行单元测试。通过测试用例展现在真实的表现层或业务逻辑层的使用。
    我的开发环境参考:(一) NHibernate 介绍 及 安装
  
项目代码: SimpleClassDemo.rar

过程

1  启动Visual Studio 2005 :创建一个类库项目,项目名称为SimpleClassDemo
2  将默认的Class.cs 修改为 Cat.cs
3  在项目中引用NUnit.Framework.dll 和NHibernate.dll , 如下图
                   


4 在项目中添加一个应用程序配置文件app.config,并编写以下内容

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    
<configSections>
        
<section name="nhibernate" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.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>
其中:数据库连接字符串根据需要改一下




5 编写Cat类,添加属性,得到以下代码

using System;
using System.Collections.Generic;
using System.Text;

namespace SimpleClassDemo
{
    
public class Cat
    
{
        
private string id;
        
private string name;
        
private char sex;
        
private float weight;

        
public Cat()
        
{
        }


        
public virtual string Id
        
{
            
get
            
{
                
return id;
            }

            
set
            
{
                id 
= value;
            }

        }


        
public virtual string Name
        
{
            
get
            
{
                
return name;
            }

            
set
            
{
                name 
= value;
            }

        }


        
public virtual char Sex
        
{
            
get
            
{
                
return sex;
            }

            
set
            
{
                sex 
= value;
            }

        }


        
public virtual float Weight
        
{
            
get
            
{
                
return weight;
            }

            
set
            
{
                weight 
= value;
            }

        }


    }

}

   编写的业务类必须符合以下规范:
   1 拥有一个没有参数的构造函数
   2 所有的属性必须有virtual修饰符,否则无法利用NHibernate进行持久化。
   3 ID字段作为一个数据库的主键使用,不要有任何实际含义

6  设定ORM 映射文件,添加一个xml文件,命名为Cat.hbm.xml,内容如下:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" >
    
<class name="SimpleClassDemo.Cat, SimpleClassDemo" table="Cat">
        
<id name="Id">
            
<column name="CatId" sql-type="char(32)" not-null="true"/>
            
<generator class="identity" />
        
</id>
        
<property name="Name">
            
<column name="Name" length="16" not-null="true" />
        
</property>
        
<property name="Sex" />
        
<property name="Weight" />
    
</class>
</hibernate-mapping>





7 将Cat.hbm.xml的生成操作属性修改为嵌入的资源
  在“解决方案资源管理器”中选择Cat.hbm.xml
  F4键切换到属性窗口
  修改“生成操作”属性为嵌入的资源,结果如下图:

             

8 在SQL Server 中创建数据库及数据表
  在SQL Servr 中创建数据库,名为NHibernate
  执行以下DDL脚本以创建Cat表

CREATE TABLE [dbo].[Cat](
    
[CatID] [int] IDENTITY(1,1NOT NULL,
    
[Name] [nvarchar](16)   NULL,
    
[Sex] [nchar](1)   NULL,
    
[Weight] [real] NULL
ON [PRIMARY]



9 创建单元测试,模拟表现层或商层中对对象的持久化操作
  在项目中添加类:名称为Cat_Test.cs
  先完成框架,代码如下:

using System;
//不使用泛型
//using System.Collections.Generic;
//替换泛型的命名空间
using System.Collections;
using System.Text;
//for NUnit UnitTest
using NUnit.Framework;
//for NHibernate Class
using NHibernate;
using NHibernate.Cfg;

using NHibernate.Expression;

namespace SimpleClassDemo
{
    
//01. Set the class as Unitt
    [TestFixture]
    
public class Cat_Test
    
{
        
private Configuration cfg;
        
private ISessionFactory factory;
        
private ISession session;
        
private ITransaction transaction;

        
/// <summary>
        
/// 构造函数,确保NHibernate需要的对象被初始化
        
/// </summary>

        public Cat_Test()
        
{
            cfg 
= new Configuration();
            cfg.AddAssembly(
"SimpleClassDemo");
            factory 
= cfg.BuildSessionFactory();
            session 
= factory.OpenSession();

        }


    }

}

 

10 在Cat_Test.cs中添加测试用例,保存对象

        [Test]
        [Description(
"新建一个对象并存储到数据库中,使用事务处理")]
        
public void SaveObjectWithTransaction()
        
{

            Cat cat 
= new Cat();
            
//cat.Id = System.Guid.NewGuid().ToString();
            cat.Name = "Tom ";
            cat.Sex 
= 'M';
            cat.Weight 
= 2.34F;

            
//告诉NHibernate 这个对象需要被保存到数据库(持久化)

            
try
            
{
                transaction 
= session.BeginTransaction();
                session.Save(cat);
                transaction.Commit();
            }

            
catch (Exception ex)
            
{
                
//throw (new ApplicationException(ex.ToString()));
                transaction.Rollback();

            }


        }

   利用TestDriven启动NUnitGUI
                 

 

   点击Run,测试用例通过
                   

 

 

 

 11 从数据库中获得一个对象列表

        [Test]
        [Description(
"根据一定的条件获得对象列表")]
        
public void GetObjectList()
        
{
            
//注意第一行和第二行都没有分号;
            IList recentCats = session.CreateCriteria(typeof(Cat))
                .Add(Expression.Eq(
"Name""Tom"))
                .List();

            
//对列表内的对象进行循环
            foreach (Cat cat in recentCats)
            
{
                System.Diagnostics.Debug.WriteLine(cat.Id 
+" Name:" +cat.Name);
            }


        }

 
 
12  将更新的信息重新存储到数据库

        [Test]
        [Description(
"从数据库中获得对象并更新")]
        
public void UpdateObject()
        
{
            
//获得一个已有对象
            Cat updateCat = (Cat)session.Load(typeof(Cat), "1");
            updateCat .Name 
= "New Name";
            
//更新对象在数据库中的存储
            session.Flush();

        }


13  删除对象在数据库中的存储

        [Test]
        [Description(
"删除在数据库中已经持久化的对象")]
        
public void DeleteObject()
        
{
            
//获得一个已有对象
            try
            
{
                Cat deleteObject 
= (Cat)session.Load(typeof(Cat), "2");
                
//更新对象在数据库中的存储
                session.Delete(deleteObject);
                
            }

            
catch 
            
{
                
            }

            

        }


14 运行全部测试用例,通过
           




版本修订记录:2008-1-3 :第一版完成




 

posted on 2007-12-31 20:45  林克坚  阅读(394)  评论(0)    收藏  举报