当前位置: 首页 > 编程日记 > 正文

NHibernate初学体验记

NHibernate 是一个基于.Net 的针对关系型数据库的对象持久化类库。NHibernate 来源于优秀的基于Java的关系型持久化工具Hibernate。NHibernate持久化你的.Net 对象到关系型数据库,远胜于写SQL去从数据库存取对象。你的代码仅仅和对象关联,NHibernat 自动产生SQL语句,并确保对象提交到正确的表和字段中去。NHibernate极大地减少了数据层代码的编写,当然提高了开发的效率和质量。体验一下吧。(有关Hibernate的资料请参考文末)

测试环境:单机安装Win2003SP2 + SQL2000 + .NET2.0 + VS2005

一、下载安装NHibernate

下载地址:http://sourceforge.net/project/showfiles.php?group_id=73818

运行安装程序NHibernate-1.2.1.GA.msi,默认情况下“C:"Program Files"NHibernate”目录下。

二、准备数据库

1.在SQL Server2000下创建NHibernate数据库;

2.执行如下SQL语句创建数据表users:

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

三、开发程序
1.在VS2005中新建类库项目NHibernate.Examples,同时选中“创建解决方案目录”复选框。
   
<?XML:NAMESPACE PREFIX = V />    
2.在NHibernate.Examples类库项目创建类文件User.cs,内容如下。(注:一个User对象对应数据表users中的一条记录。)

using System;

namespace NHibernate.Examples.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; }

        }

    }

}

3.在NHibernate.Examples类库项目创建映射文件User.hbm.xml,并将文件的“生成操作”属性设置为“嵌入的资源”(如图),映射文件将成为装配件的一部分。
            

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-
2.2">
    <class name="NHibernate.Examples.QuickStart.User, NHibernate.Examples" table="users"
lazy="false">
          <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>

让我们来看看User.hbm.xml文件中让我们感兴趣的某些行。第一个有趣的标签是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(从文档中获取更多信息)

提示:如果你仅仅是改变映射文件,你不能使用build 而应该Rebuild项目。Visual Studio.Net 不会重新编译有改变的映射文件。

4.新建一个Windows应用程序项目NHibernateQuickStart,并添入已有的解决方案。
   

5.在项目NHibernateQuickStart中添加对NHibernate.dll的引用(默认安装情况下在“C:"Program Files"NHibernate"bin"net-2.0"NHibernate.dll”)。
   

6.在项目NHibernateQuickStart中添加对NHibernate.Examples类库项目的引用:
   

7. 在项目NHibernateQuickStart中添加应用程序配置文件App.config,内容如下:(告诉NHibernate 去哪里连接数据库以及数据库的相关配置)

<?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>

8.开始编写写入数据的代码。

(1)在项目NHibernateQuickStart中Form1窗体上添一个按钮button1,双击button1进入代码编辑界面,我们将在button1_Click事件中编写代码。

(2)在代码中添加using声明:

using NHibernate;

using NHibernate.Cfg;

using NHibernate.Examples.QuickStart;

(3)button1_Click事件代码如下:

private void button1_Click(object sender, EventArgs e)

        {

            Configuration cfg = new Configuration();

            cfg.AddAssembly("NHibernate.Examples");

            ISessionFactory factory = cfg.BuildSessionFactory();

            ISession session = factory.OpenSession();

            ITransaction transaction = session.BeginTransaction();

            User newUser = new User();

            newUser.Id = "joe_cool_test";

            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();

        }

(4)编译整个解决方案。执行生成的EXE文件NHibernateQuickStart.exe,点击button1。之后,打开数据库users表,如果产生了一条记录,则成功!

本项目源码下载:NHibernateQuickStart1.rar

    ===================================================================================

另外,本人还写了一个复杂点的示例,包含了增加、修改、删除、显示记录的操作:
    源码下载:NHibernateQuickStart2.rar。看了这个代码你会发现项目中充斥了如下类似的代码:

            Configuration cfg = new Configuration();

            cfg.AddAssembly("NHibernate.Examples");

            ISessionFactory factory = cfg.BuildSessionFactory();

            ISession session = factory.OpenSession();

            ITransaction transaction = session.BeginTransaction();

如何解决这个问题呢?以后再探讨吧J

===================================================================================

推荐阅读《Hibernate Quickly中文版》一书,虽然是针对Java的,但是思想是相通的,NHibernate本源于Hibernate,看了之后会Hibernate有全面深入的认识。

其它资料:

Hibernate官方网站:http://www.hibernate.org

NHibernate论坛:http://www.okec.cn

renrenqq的blog(有丰富的ORM资料):http://www.cnblogs.com/renrenqq

    (注:本人参考NHibernate官方快速指南未能测试成功,后整理本篇文档,参考了译文:http://www.okec.cn/htm_data/7/0709/194.html

=====================================================================================================
参考NHibernate官方快速指南编写代码遇到的问题:
From:http://hi.baidu.com/zsea/blog/item/7d999e3d8a54c203baa1678d.html

一、Test.Model.Person.hbm.xml(2,2): XML validation error: 未能找到元素“urn:nhibernate-mapping-2.0:hibernate-mapping”的架构信息。

将2.0改为2.2

二、 The following types may not be used as proxies:
         Test.Model.Person: method set_Id should be virtual
         Test.Model.Person: method get_Name should be virtual
         Test.Model.Person: method set_Name should be virtual
         Test.Model.Person: method get_Id should be virtual

类配置文件中Class的Lazy改为false
         网上搜到的三种解决方案:
        1.   You can follow the advice of the exception and add "virtual" to all of your properties, and make sure your class is non-sealed. Obviously you'll want to do this if you think you might want to take advantage of the lazy-initializing proxy feature.   However, changing your classes may not be practical or advisable if you have a legacy codebase, or it may just bother you that a "transparent" persistence framework is dictating how you design certain aspects of your value classes.   That's where Options 2 and 3 come in.   Both of those involve changing back to the old behavior.

2.  To change the lazy-initialization proxy setting for a specific class, you can add a "lazy='false'" attribute to the <class> mapping element.   This might look something like:
<class
     name="NorthwindClasses.Category, NorthwindClasses"
     table="Categories"
     lazy="false"
>
3.  To change the lazy-initialization proxy setting for all classes in a given mapping file, you can add a "default-lazy='false'" attribute to the <hibernate-mapping> element, as follows:
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0" default-lazy="false">
Unfortunately, Option 3 doesn't really help you much if you do one <class> mapping per <hibernate-mapping> file, a practice which I personally follow and recommend.   It's too bad, but there doesn't seem to be any way to set this default in the <nhibernate> global configuration.   But if you do happen to have all of your <class>'s in one .hbm.xml file, "default-lazy" can help you out.

转载于:https://www.cnblogs.com/yangjunwl/articles/1112483.html

相关文章:

java运算符-逻辑、三元运算符

1.逻辑运算符 逻辑运算符&#xff0c;它是用于布尔值进行运算的&#xff0c;运算的最终结果为布尔值true或false。 运算符 运算规则 范例 结果 & 与 false&true False | 或 false|true True ^ 异或 true^flase True ! 非 !true Flase && …

windowsclient开发--为你的client进行国际化

之前博客讲过函数&#xff1a; GetUserDefaultUILanguage Returns the language identifier for the user UI language for the current user. 我们国际化主要是支持三种语言&#xff0c;中文简体、繁体中文、以及英文。 获得用户使用语言 所以我们能够通过GetUserDefaultUI…

大数据主要职位

大数据主要有以下职位&#xff1a; 1&#xff09;数据分析师Data analyst&#xff1a;指熟悉相关业务&#xff0c;熟练搭建数据分析框架&#xff0c;掌握和使用相关的分析常用工具和基本的分析方法&#xff0c;进行数据搜集、整理、分析&#xff0c;针对数据分析结论给管理销售…

【Vegas原创】DataSet相互添加DataTable

//为DataSet添加DataTableds.Tables.Add(dt);//为DataTable添加DataSetdatatable dt dataset.Table[0]

大数据岗位必知必会的53个Java基础

文章目录1. java中和equals和hashCode的区别2. int与integer的区别3. String、StringBuffer、StringBuilder区别4. 什么是内部类&#xff1f;内部类的作用5. 进程和线程的区别6. final&#xff0c;finally&#xff0c;finalize的区别7. Serializable 和Parcelable 的区别8. 静态…

4514: [Sdoi2016]数字配对

Description 有 n 种数字&#xff0c;第 i 种数字是 ai、有 bi 个&#xff0c;权值是 ci。 若两个数字 ai、aj 满足&#xff0c;ai 是 aj 的倍数&#xff0c;且 ai/aj 是一个质数&#xff0c; 那么这两个数字可以配对&#xff0c;并获得 cicj 的价值。 一个数字只能参与一次配对…

bzoj 3339 莫队

题意&#xff1a; 求任意一个区间的SG函数。 想到线段树&#xff0c;但是线段树合并很麻烦。 线段树——分块。 分块的一个应用就是莫队算法。 怎么暴力递推呢&#xff1f; 从一个区间到另一个区间&#xff0c;Ans 取决于 Ans 和 加入和删除的这个数的大小比较。加入一个新数&a…

Ajax检测注册用户是否存在

HTML代码如下:LoginValidate.aspx<% Page Language"C#" AutoEventWireup"true" CodeFile"LoginValidate.aspx.cs" Inherits"LoginValidate" %><html xmlns"http://www.w3.org/1999/xhtml" ><head runat"…

Java Robot对象实现服务器屏幕远程监视

Java Robot对象实现服务器屏幕远程监视2006-01-16 17:33 作者&#xff1a; xiepan110 出处&#xff1a; BLOG 责任编辑&#xff1a;方舟   摘要&#xff1a;  有时候&#xff0c;在Java应用程序开发中&#xff0c;如&#xff1a;远程监控或远程教学&#xff0c;常常需要对计…

Oracle常用傻瓜问题1000问

1. Oracle安装完成后的初始口令? internal/oracle sys/change_on_install system/manager scott/tiger sysman/oem_temp 2. ORACLE9IAS WEB CACHE的初始默认用户和密码&#xff1f; administrator/administrator 3. oracle 8.0.5怎么创建数据库? 用orainst。如果有motif界面&…

安装需要的第三方库时,命令行输入pip提示不是内部或外部命令

简介 在做Python开发时&#xff0c;安装需要的第三方库时&#xff0c;大多数人喜欢选择在命令行用pip进行安装。 然而有时敲入pip命令会提示‘pip’不是内部或外部命令。。如图&#xff1a; 解决办法 1、在python安装目录中找得到script文件夹&#xff0c;查看文件夹内部是否存…

ehcache导致Tomcat重启出错

最近使用ehcache出现了问题&#xff0c;只要在配置文件中打开缓存&#xff0c;Tomcat在重启时就会报内存溢出异常。按说ehcache自己开启的资源&#xff0c;应该自己关闭才是。经查阅资料发现&#xff0c;需要在web.xml中配置一个监听器&#xff0c;该监听器会在应用程序关闭的时…

[置顶]完美简版学生信息管理系统(附有源码)管理系统

简版学生信息管理系统 目前为止找到的简版系统中最新、最全的java类管理系统 点击进入简版系统 如果无法直接连接&#xff0c;请进入: https://blog.csdn.net/weixin_43419816/article/details/104234590 做CSDN最完美的搬运工&#xff01;

怎样成为一名优秀的系统工程师

一个优秀的系统集成工程师(包括售前和实施)的技术线路笔者注:并不是每个都要求掌握,只是寻找自己的一条技术线路1&#xff1a;网络基础知识&#xff1a;深刻理解网络基本概念&#xff0c;例如>ISO/OSI、TCP/IP、VLAN、各种LAN、WAN协议、各种路由协议、NAT等等Cisco&#xf…

星期六第一次加班

虽然说老板叫我们加班&#xff0c;但是貌似没有我什么事情的饿&#xff0c;和张明在一起&#xff0c;真的很不自在&#xff0c;我知道我很自大&#xff0c;我在漫漫的改变自己&#xff0c;他听不惯我说话&#xff0c;但是有什么的呢&#xff01;我相信他是一个好的程序员&#…

WPF入门(三)-几何图形之不规则图形(PathGeometry) (2)

WPF入门(三)->几何图形之不规则图形(PathGeometry) (2) 原文:WPF入门(三)->几何图形之不规则图形(PathGeometry) (2)上一节我们介绍了PathGeometry中LineSegment是点与点之间绘制的一条直线&#xff0c;那么我们这一节来看一下点与点之间绘制曲线ArcSegment 先来看一段代…

zookeeper图形工具——zkui

虽然zookeeper安装包提供了客户端工具zkcli&#xff0c;但是命令特别少 &#xff0c;每次想看看里面的节点信息特别费劲。 幸好有图形工具——zkui&#xff0c;https://github.com/echoma/zkui&#xff0c;下载地址 https://github.com/echoma/zkui/wiki/Download。 上个图&…

第一篇博客,java学生管理系统(挑战全网最全)

java学生信息管理系统&#xff0c;&#xff08;课设必备&#xff09;&#xff0c;附有源码和简版链接 博主虽然技术不高&#xff0c;但是系统写的真的是没话说&#xff0c;留着开学java课设用了。 直接转载链接了&#xff0c;查看系统入口 https://blog.csdn.net/weixin_4341…

ccna实验大全

ccna实验大全启动接口&#xff0c;分配IP地址&#xff1a; router> router> enable router# router# configure terminal router(config)# router(config)# interface Type Port router(config-if)# no shutdown router(config-if)# ip address IP-Address Subnet-Mask r…

实现分布式服务注册及简易的netty聊天

现在很多地方都会用到zookeeper, 用到它的地方就是为了实现分布式。用到的场景就是服务注册&#xff0c;比如一个集群服务器&#xff0c;需要知道哪些服务器在线&#xff0c;哪些服务器不在线。 ZK有一个功能&#xff0c;就是创建临时节点&#xff0c;当机器启动应用的时候就会…

《深入理解计算机系统》学习心得二:关于show-bytes的 学习

此段代码&#xff0c;使用强制类型转换来访问和打印不同程序对象的字节表示。show-bytes打印出每个以十六进制表示的字节。 /* show-bytes - prints byte representation of data */ /* $begin show-bytes */ #include <stdio.h> /* $end show-bytes */ #include <st…

Jquery基础:append、prepend、after、before、appendTo的区别

append() 是在被选元素的结束标签前面(即改被选元素的内部)插入指定内容。 <html><head><script type"text/javascript" src"/jquery/jquery.js"></script><script type"text/javascript">      $().ready(…

域名删除时间及whois状态说明

国际域名状态 Active : 正常状态&#xff1b; Registry-hold&#xff1a;注册局暂停&#xff0c;域名没有解析&#xff0c;不能正常使用&#xff0c;可以续费&#xff1b; Registry-lock&#xff1a;注册局锁定&#xff0c;域名有解析&#xff0c;正常使用&#xff0c;不能更改…

JavaScript中的正则表达式解析

正则表达式(regular expression)对象包含一个正则表达式模式(pattern)。它具有用正则表达式模式去匹配或代替一个字符串(string)中特定字符(或字符集合)的属性(properties)和方法(methods)。 要为一个单独的正则表达式添加属性,可以使用正则表达式构造函数(constructor functio…

Markdown上下标内容多于一项

用{ }括起来。转载于:https://www.cnblogs.com/144823836yj/p/10261391.html

详述FileUpload 控件上传单文件

第一步&#xff1a;添加两个Label控件&#xff0c;一个是用于标题显示&#xff0c;一个是用于上传完成消息提示。 第二步&#xff1a;创建一个FileUpload控件到Page页面&#xff0c;注意FileUpload控件本身只提供文件的选举操作&#xff0c;而实际的文件上传功能需要我们创建一…

基于μC/OS—III的CC1120驱动程序设计

基于μC&#xff0f;OS—III的CC1120驱动程序设计 时间&#xff1a;2014-01-21 来源&#xff1a;电子设计工程 作者&#xff1a;张绍游&#xff0c;张贻雄&#xff0c;石江宏关键字&#xff1a;CC1120 嵌入式操作系统 STM32F103ZE 驱动设计 摘要&#xff1a;本文根据实…

LinkQueue的基本创建

队列是一种先进先出&#xff08;first in first out,缩写为FIFO&#xff09;的线性表。它只允许在表的一端进行插入&#xff0c;而在另一端进行删除元素。和平常我们排队打饭类似。 链队列是用链表表示的队列的简称。一个链队列需要两个分别指示队头和队尾的指针&#xff08;分…

请教一个算法问题,有两个数组A,B,判断A中是否至少有一个元素和B中元素相同...

最笨的办法当然是二层嵌套循环&#xff0c;但觉得应该有更好的方法&#xff0c;但是着实想不出来&#xff0c;想听听大家的意见&#xff0c;大家帮帮小弟 i.e string[] A{"X","Y","Z","W"}; string[] B{"X","E",&…

超市账单管理系统之-------登录

报500的错大部分都是springmvc的jar包没有导对&#xff0c;最好用3点几的版本 。。。。在项目中要把包导对 pom.xml 所需要的jar包 1 <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"2 xs…