NHibernate入门实例

转:http://www.cnblogs.com/huhai121/p/3955755.html

NHibernate应用一:环境准备

  本章将介绍整个开发环境所需开发和数据库工具,以及数据库设计,后续章节将以当前数据库设计为示例而展开。

  一、环境配置:

  A、操作系统

    Win7旗舰版

  B、开发环境

    VS2010

    NHibernate4.0.0

  C、数据环境

    PowerDesigner 15.1

    Sql Server 2008

  

二、数据库设计:

  A、表结构设计:

  

  B、建表语句

    1)、客户表

      create table CustomerInfo (
         CustomerID           varchar(36)          not null,
         CustomerName         varchar(200)         not null,
         LinkPhone            varchar(20)          not null,
         LinkAddress          varchar(500)         not null,
         constraint PK_CUSTOMERINFO primary key (CustomerID)
      )      
      go

    2)、产品表

      create table ProductInfo (
         ProductID            varchar(36)          not null,
         ProductName          varchar(100)         not null,
         ProductPrice         decimal(18,2)        not null,
         constraint PK_PRODUCTINFO primary key (ProductID)
      )
      go

    3)、订单表

      create table OrderForm (
         OrderFormID          varchar(36)          not null,
         CustomerID           varchar(36)          null,
         OrderFormTime        datetime             not null,
         constraint PK_ORDERFORM primary key (OrderFormID)
      )
      go

    4)、订单明细表

      create table OrderProduct (
         OrderProductID       varchar(36)          not null,
         ProductID            varchar(36)          null,
         OrderFormID          varchar(36)          null,
         constraint PK_ORDERPRODUCT primary key (OrderProductID)
      )
      go

  三、软件配置

  要为 Microsoft Visual Studio 2010添加编写NHibernate配置文件智能提示的功能。只要在下载的NHibernate 里找到configuration.xsd 和nhibernate-mapping.xsd 两

  个文件并复制到X:\Program Files\Microsoft Visual Studio 9.0\Xml\Schemas 目录即可。

NHibernate应用二:第一个NHibernate程序

  当前期工作都准备完成后,将开始NHibernate的学习过程,而在第一个NHibernate程序中,将实现通过NHibernate根据客户编号对客户表进行单条记录的查询示例。该示例中,我们将按以下几部分说明。

  一、结构分析

    1.分层

      习惯了分层的体系结构,所以将第一个NHibernate程序按以下方式进行分层

     

    

      说明:

      A.Model层:模型层,是最底层,类似于传统三层中的实体层,用于持久化类和O/R Mapping操作。

      B.DAL层:DataAccessLayer层,高于Model层而低于App层,是数据访问层,定义对象的CRUD 操作。

      C.App层:应用层,最高层,用于跟用户的交互。

    2.引用

    Model层:引用Iesi.Collections.dll 程序集

    DAL层:引用NHibernate.dll 和Iesi.Collections.dll 程序集,引用Model层。

    App层:引用NHibernate.dll 和Iesi.Collections.dll 程序集,引用Model层和DAL层。

  

  二、Model层

    按简单传统.NET 对象(POCOs,Plain Old CLR Objects(Plain Ordinary CLR Objects))模型编程时需要持久化类,也可以说是DTO(Data Transfer Object,数据传

    送对象)模式(这是迄今为止可以工作的最简单方式)。在NHibernate 中,POCO 通过.NET 的属性机制存取数据,就可以把它映射成为数据库表。

    1.客户表的持久化类

       为Customer对象新建一个类文件,命名为CustomerEntity.cs

public class CustomerEntity
    {
        public virtual string CustomerID { get; set; }
        public virtual string CustomerName { get; set; }
        public virtual string LinkPhone { get; set; }
        public virtual string LinkAddress { get; set; }
    }

        说明:

      A. NHibernate 使用属性的getter 和setter 来实现持久化

      B. 属性可设置为public、internal、protected、protected internal 或private

      注意:

      NHibernate默认使用代理功能,要求持久化类不是 sealed 的,而且其公共方法、属性和事件声明为virtual。在这里,类中的字段要设置为virtual,否则出现异常,

      异常内容如下:

       “failed: NHibernate.InvalidProxyTypeException : The following types may not be used as proxies: DomainModel.Entities.Customer: method get_CustomerId

       should be virtual,method set_CustomerId should be virtual”。

     2. 客户表的映射文件

      为Customer对象新建一XML 文件,命名为Customer.hbm.xml

    

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class name ="NHibernateExample01.Model.Entity.CustomerEntity,NHibernateExample01.Model" table="CustomerInfo">
    <id name="CustomerID" column="CustomerID" type="string" length="36">
      <generator class ="native"></generator>
    </id>
    <property name="CustomerName" column ="CustomerName" type="string" length="200" />
    <property name ="LinkPhone" column="LinkPhone" type="string" length="20"/>
    <property name ="LinkAddress" column="LinkAddress" type="string" length="500" />
  </class>
</hibernate-mapping>

      说明:

      A. XML文件的默认生成操作为“内容”,这里需要修改为“嵌入的资源”生成,否则出现异常,异常内容如下:

       Unable to locate persister for the entity named ‘NHibernateExample01.Model.Entity.CustomerEntity‘.

          The persister define the persistence strategy for an entity.

          Possible causes:

          The mapping for ‘NHibernateExample01.Model.Entity.CustomerEntity‘ was not added to the NHibernate configuration

     B. 配置节< hibernate-mapping>中,urn:nhibernate-mapping-2.2是Xml的命名空间,跟NHibernate的DLL版本无关

     C. 配置节<hibernate-mapping>中,如果没有限定assembly 和namespace,那么在配置节<Class>中,需要完整限定名。否则出现异常,异常内容如下:

         Could not compile the mapping document: NHibernateExample01.Model.Entity.Customer.hbm.xml

     D. 配置节<generator>中,Native主键生成方式会根据不同的底层数据库自动选择Identity、Sequence、Hilo主键生成方式根据不同的底层数据库采用不同的主键

           生成方式。由于Hibernate会根据底层数据库采用不同的映射方式,因此便于程序移植,项目中如果用到多个数据库时,可以使用这种方式。

  三、DAL层

     1. 会话管理类

     整个NHibernate的数据流程如下:

     A.通过Configuration(NHibernate.Cfg.Configuration)构建ISessionFactory的属性和映射文件。

     B. 通过ISessionFactory生成Session。ISessionFactory 是线程安全的,很多线程可以同时访问它。

     C. Session进行一个单线程的单元操作(数据操作)。Session 不是线程安全的,它代表与数据库之间的一次操作,在所有的工作完成后,需要关闭。

     由此可见,ISessionFactory是整个数据访问的核心,由于它是线程安全性的,所以它可以做全局性对象,将使用单例模式来构建对它的管理。

public class SessionManager
    {
        private ISessionFactory _sessionFactory;
        public SessionManager()
        {
            _sessionFactory = GetSessionFactory();
        }

        private ISessionFactory GetSessionFactory()
        {
            return (new Configuration()).Configure().BuildSessionFactory();
        }

        public ISession GetSession()
        {
            return _sessionFactory.OpenSession();
        }
    }

   2. 数据访问类

    NHibernate数据访问是交由Session完成的,所以,数据访问的重点就在ISession上。

    在DAL层上新建一个CustomerDal.cs类,用来进行数据访问,编写一方法GetCustomerId 用于读取客户信息。

  

public class CustomerDal
    {
        private ISession _session;
        public ISession Session
        {
            set
            {
                _session = value;
            }
        }

        public CustomerDal(ISession session)
        {
            _session = session;
        }

        public CustomerEntity GetCustomerByID(string customerID)
        {
            return _session.Get<CustomerEntity>(customerID);
        }
    }

  4. App层

    1. NHibernate配置文件

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2" >
  <session-factory>
    <property name="connection.driver_class">
      NHibernate.Driver.SqlClientDriver
    </property>
    <property name="connection.connection_string">
      server=.;database=NHibernateSample;uid=sa;pwd=123456;
    </property>
    <property name="adonet.batch_size">10</property>
    <property name="show_sql">true</property>
    <property name="dialect">
      NHibernate.Dialect.MsSql2008Dialect
    </property>
    <property name="command_timeout">10</property>
    <property name="query.substitutions">
      true 1, false 0, yes ‘Y‘, no ‘N‘
    </property>
    <mapping assembly="NHibernateExample01.Model"/>
  </session-factory>
</hibernate-configuration>

    说明:

    A.XML文件的默认“复制到输出目录”为“不复制”,这里需要修改为“始终复制”,否则出现异常,异常内容如下:

       failed: NHibernate.Cfg.HibernateConfigException : An exception occurredduring configuration of persistence layer. ---->

      System.IO.FileNotFoundException : 未能找到文件“NHibernateSample\DAL.Test\bin\Debug\hibernate.cfg.xml””

    B.配置文件会随着NHibernate的DLL版本不同而不同,需要详细查看NHibernate的DLL的Change日志。

    C.属性connection.provider设置了数据库连接提供者(一般不需要更改,除非你决定自己实现提供者)。

    D. 属性connection.driver_class设置了数据库的的驱动类(这里设置了SqlServer的驱动类)。

    E. 属性connection.connection_string是数据库的连接字符串。

    F. 属性show_sql设置是否在运行时是否在控制台显示正在执行的SQL语句(这个属性在调试程序时很有用)。

    G. 属性dialect是NHibernate方言, 可以让NHibernate使用某些特定的数据库平台的特性。

    H. 属性query.substitutions,把NHibernate查询中的一些短语替换为SQL短语(比如说短语可能是函数或者字符)。

    I.  属性mapping节点设置了将使用到的映射文件。

      2. 窗体文件内容

    

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            Init();
        }

        private void Init()
        {
            string CustomerID = "48CBCDFC-1AAA-4A08-9C9B-4578C6F59E8C";
            SessionManager _helper = new SessionManager();
            ISession _session = _helper.GetSession();

            CustomerDal _sample = new CustomerDal(_session);

            CustomerEntity entity = _sample.GetCustomerByID(CustomerID);

            if (entity != null)
            {
                txtName.Text = entity.CustomerName;
                txtAddress.Text = entity.LinkAddress;
                txtPhone.Text = entity.LinkPhone;
            }

        }
    }

    说明:

      A.数据库中CustomerInfo表中有一条数据:


CustomerID


CustomerName


LinkPhone


LinkAddress


48CBCDFC-1AAA-4A08-9C9B-4578C6F59E8C


huhai


18618181513


内蒙古呼和浩特市赛罕区东影西路

    B. 显示结果如下:

      

时间: 2024-11-05 14:38:02

NHibernate入门实例的相关文章

Nhibernate系列学习之(一) ORM and Nhibernate入门实例解析

最近框架项目需要,数据层想使用Nhibernate,代替传统的sql语句的写法,更加使用面向对象的思维来维护实体与数据库的这层关系映射(ORM),好在之前接触过Java时学习使用了Hibernate,先来了解ORM.    什么是ORM? 对象-关系映射(Object/Relation Mapping,简称ORM),是随着面向对象的软件开发方法发展而产生的.面向对象的开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统.对象和关系数据是业务

DWR之入门实例(一)

DWR(Direct Web Remoting)是一个WEB远程调用框架.利用这个框架可以让AJAX开发变得很简单.利用DWR可以在客户端利用JavaScript直接调用服务端的Java方法并返回值给JavaScript就好像直接本地客户端调用一样(DWR根据Java类来动态生成JavaScrip代码).它的最新版本DWR0.6添加许多特性如:支持Dom Trees的自动配置,支持Spring(JavaScript远程调用spring bean),更好浏览器支持,还支持一个可选的commons-

React 入门实例教程

React 入门实例教程 作者: 阮一峰 日期: 2015年3月31日 现在最热门的前端框架,毫无疑问是 React . 上周,基于 React 的 React Native 发布,结果一天之内,就获得了 5000 颗星,受瞩目程度可见一斑. React 起源于 Facebook 的内部项目,因为该公司对市场上所有 JavaScript MVC 框架,都不满意,就决定自己写一套,用来架设 Instagram 的网站.做出来以后,发现这套东西很好用,就在2013年5月开源了. 由于 React 的

Java AIO 入门实例(转)

Java7 AIO入门实例,首先是服务端实现: 服务端代码 SimpleServer: Java代码   public class SimpleServer { public SimpleServer(int port) throws IOException { final AsynchronousServerSocketChannel listener = AsynchronousServerSocketChannel.open().bind(new InetSocketAddress(por

FPGA入门实例一:LFSR

一:任务: 要求使用Verilog语言在Xilinx Virtex-6开发板上实现线性反馈移位寄存器(LFSR)的硬件逻辑设计. 二:前期准备: 基本上完成一个简单的设计需要用到以下几个软件 逻辑:Uedit32(硬件狗吐血推荐) 综合:ISE14.1 仿真:Modelsim SE 10.1b 分析:Chipscope Pro 三:设计流程 逻辑: 首先当然是RTL级设计,俗称硬件逻辑设计.使用的是Uedit32,这个软件相当于一个记事本,但编辑功能十分强大,简直是写Verilog代码的神器,具

php页面get方法实现ajax,入门实例教程

ajax,入门实例教程 本例针对php页面,做了一个小的demo加深对ajax的理解 1.文档结构: 共有ajax.php 和action.php 2个页面. 2.源码如下: /*ajax.php页面*/<!DOCTYPE html> <html lang="en"> <head> <title> ajax</title> <script type="text/javascript"> func

Omnet++ 4.0 入门实例教程

http://blog.sina.com.cn/s/blog_8a2bb17d01018npf.html 在网上找到的一个讲解omnet++的实例, 是4.0下面实现的. 我在4.2上试了试,可以用.照着做就能完成,有些小地方不同而已 Omnet++ 4.0 入门实例教程根据http://omnest.com/webdemo/ide 上的实例,自己动手做了做.新版本的4.0 跟它视频上的版本有些差别,配图说明一下我的操作过程,供大家一起学习.现在开始.首先,开发环境选择simulation 的视

freemarker入门实例与源码研究准备工作

首先去freemarker官网下载源码jar包,本文是基于freemarker-2.3.21.tar.gz进行研究的.解压源码包,找到freemarker的源码部分导入eclipse工程中.需要注意的是:freemarker的ftl文件解析使用javacc实现的,所以源码中没有解析类(FMParse.java).要想研究freemarker源码,往往还需要引入freemarker.jar(含有FMParse.class),否则源码会出现编译问题.另外,还需要引入的jar包有:commons-lo

Android HttpGet() 请求简单入门实例

HttpClient httpclient = new DefaultHttpClient(); String url = "http://example.com"; List<NameValuePair> params = new ArrayList<NameValuePair>(); params.add( new BasicNameValuePair( "param", "value" ) ); URI uri =