NHibernate学习系列一

NHibernate是一个面向.NET环境的对象/关系数据库映射工具。对象/关系数据库映射(object/relational mapping,ORM)这个术语表示一种技术,用来把对象模型表示的对象映射到基于SQL的关系模型数据结构中去。

优点:

(1)NHibernate不仅仅管理.NET类到数据库表的映射(包括.NET 数据类型到SQL数据类型的映射),还提供数据查询和获取数据的方法,可以大幅度减少开发时人工使用SQL和ADO.NET处理数据的时间。

(2)面向对象:NHiberante的使用时只需要操纵对象,使开发更对象化,抛弃了数据库中心的思想,完全的面向对象思想。

(3)透明持久化:是他们正与(仅仅一个)Session相关联。一旦这个Session被关闭,这些对象就会脱离持久化状态,这样就可被应用程序的任何层自由使用。

缺点:

(1)内存消耗:直接使用“SqlHelper、DAL、BLL”无疑是最省内存的。使用NHibernate后,内存开销比较大,这点是毋庸置疑的。

(2)批量数据库的处理:由于NHibernate是基于面向对象的ORM框架,处理数据库的方式是针对单个对象的。对数据库的增、删、改都是正对一条记录而言。对于批量修改、删除数据,不适合用NHiberante。这也是所有OR框架弱点。

(3)表关系比较混乱时也不适合使用NHiberante。NHibernate只适合于表与表的关系比较明确的环境中。如本应该建立外键的,没有建立外键。这时使用NHiberante不仅没有减少工作量,反而增加了工作量。

使用NHiberante做一个简单实例:

(1)添加引用程序集:

(2)编写一个持久化类:

public class Classes
    {
        public Classes()
        {
        }
        #region Classes属性定义
        private int _CID;
        /// <summary>
        /// 班级表ID
        /// </summary>
        public virtual int CID
        {
            get
            {
                return _CID;
            }
            set
            {
                _CID = value;
            }
        }
        private string _CName;
        /// <summary>
        /// 班级名称
        /// </summary>
        public virtual string CName
        {
            get
            {
                return _CName;
            }
            set
            {
                _CName = value;
            }
        }
        private int _CCount;
        /// <summary>
        /// 班级人数
        /// </summary>
        public virtual int CCount
        {
            get
            {
                return _CCount;
            }
            set
            {
                _CCount = value;
            }
        }
        private string _CImg;
        /// <summary>
        /// 班级Logo图片
        /// </summary>
        public virtual string CImg
        {
            get
            {
                return _CImg;
            }
            set
            {
                _CImg = value;
            }
        }
        private bool _CIsDel;
        /// <summary>
        /// 删除标志
        /// </summary>
        public virtual bool CIsDel
        {
            get
            {
                return _CIsDel;
            }
            set
            {
                _CIsDel = value;
            }
        }
        private DateTime _CAddTime;
        /// <summary>
        /// 录入时间
        /// </summary>
        public virtual DateTime CAddTime
        {
            get
            {
                return _CAddTime;
            }
            set
            {
                _CAddTime = value;
            }
        }
        #endregion
    }

  NHibernate对属性使用的类型不加任何限制。所有的.NET类型和原始类型(比如string,char和DateTime)都可以被映射,也包括.Net 集合(System.Collections)中的类。你可以把它们映射成为值,值集合,或者与其他实体类相关联。Id是一个特殊的属性,代表了这个类的数据库标识符(主键)。为了让上面提到运行时类增强功能生效,NHibernate持久化类的所有的public的属性必须声明为virtual。

(3)编写xml文件映射:xml文件必须以“类名.hbm.xml”格式命名;创建解决方案文件夹放入文件如下,则编写xml时就会有智能提示:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="HeiMaNH" assembly="HeiMaNH">
    <class name="HeiMaNH.Classes,HeiMaNH" table="Classes">
        <id name="CID" column="CID" type="Int32">
            <generator class="identity" />
        </id>
        <property name="CName" column="CName" type="String" length="50"  />
        <property name="CCount" column="CCount" type="Int32" length="4"  />
        <property name="CImg" column="CImg" type="String" length="40"  />
        <property name="CIsDel" column="CIsDel" type="Boolean" length="1"  />
        <property name="CAddTime" column="CAddTime" type="DateTime" length="8" />

    </class>
</hibernate-mapping>

(4)使用NHibernate的ISession(持久化管理器), 我们通过ISession来从数据库中存取数据

 protected void Page_Load(object sender, EventArgs e)
        {
            //1.创建 会话 工厂(是可以被共享使用的, 是线程安全的)
            ISessionFactory factory = new Configuration().Configure().BuildSessionFactory();
            //2.创建 会话(非共享使用,非线程安全,但是如果针对当前请求里的每个数据库操作都创建 会话,则极度浪费资源,所以,最好是 针对每次请求 只创建一个 会话)
            ISession sess = factory.OpenSession();
            //HttpContext.Current.Items.Add("nfsession", sess);
            //3.创建查询对象  (hql-hibernate query language)
            IQuery query = sess.CreateQuery("from Classes  c where c.CIsDel = false");
            //3.2更加面向对象化的查询方式
            //ICriteria crit = sess.CreateCriteria(typeof(Classes));
            //crit.Add(Restrictions.Eq("CIsDel", false));
            //crit.Add(Restrictions.Eq("CName", "刘德华2"));
            //IList<Classes> list = crit.List<Classes>();
            //4.获得查询结果
            IList<Classes> list = query.List<Classes>();
            rptList.DataSource = list;
            rptList.DataBind();
        }

对象状态:

瞬时(transient)
数据库中没有数据与之对应,超过作用域会被垃圾回收.
其实 一般就是 new出来 且与 ISession没有关联的对象;

持久(persistent)
数据库中有数据与之对应,当前与ISession关联,并且相关联的isession也没有关闭,事物没有提交:持久对象状态发生改变,在事务提交时会影响到数据库(nhibernate能检测到改变);

脱管(detached-脱离了nh的管理)
数据库中有数据与之对应,但当前没有session与之关联;脱管对象状态发生改变,nhibernate不能检测到;

HQL和Criteria

HQL(Hibernate Query Language)
面向对象的查询语言,与SQL不同,HQL中的对象名是区分大小写的(除了C#类和属性其他部分不区分大小写);
HQL中查的是对象而不是表,并且支持多态;
HQL主要通过Query来操作,Query的创建方式:
IQuery q = sess.CreateQuery(hql);
from Person
from User u where u.name=:name
from User u where u.name=:name and u.birthday<:birthday

Criteria
Criteria 是一种比HQL更面向对象的查询方式;
ICriteria crit = sess.CreateCriteria(typeof(User));
简单属性条件如:crit.Add(Restrictions.eq(proName,value));
crit.Add(Restrictions.eqProperty(proName,otherProName));

使用NHibernate进行关联映射

(1)多对一(Student - Classes)

(2)一对多(Classes-Student)

(3)一对一(Student-IdCard)

(4)多对多(Student-Subject)

(5)集合映射(Set, List, Map, Bag)

(6)级联:Cascade(Classes-Student)

NHibernate学习系列一

时间: 2024-10-07 06:55:14

NHibernate学习系列一的相关文章

MVC4+Springnet+Nhibernate学习系列随笔(一)

Springnet与asp.net mvc4集成大体步骤 1.首先要在MVC项目中引用的两个程序集(Spring.Web与Spring.Web.Mvc4) 集 2.修改MVC项目的Global.asax文件,将  public class MvcApplication : System.Web.HttpApplication继承的System.Web.HttpApplication修改成继承   SpringMvcApplication类,此类包含于Spring.Web.Mvc4程序集中 3.修

SpringMVC学习系列(12) 完结篇 之 基于Hibernate+Spring+Spring MVC+Bootstrap的管理系统实现

到这里已经写到第12篇了,前11篇基本上把Spring MVC主要的内容都讲了,现在就直接上一个项目吧,希望能对有需要的朋友有一些帮助. 一.首先看一下项目结构: InfrastructureProjects:是抽取出的基础项目,主要封装了一些通用的操作. SpringMVC3Demo:就是管理系统所在的项目. WeiXinAPI:是之前做微信管理平台测试时封装一些操作,如果不需要把该项目移除即可. 注:项目的前端UI框架用的是国外的一个基于Bootstrap框架的开发的Demo,如不需要替换为

Android学习系列(17)--App列表之圆角ListView(续)

http://www.cnblogs.com/qianxudetianxia/archive/2011/09/19/2068760.html 本来这篇文章想并到上篇Android学习系列(16)--App列表之圆角ListView中的,但是若是如此就让大家错过一篇新的好的文章,着实可惜.上篇中我们使用shape,corners,gradient实现了一个渐变的圆角效果,但是在完文之后的实践中,我发现有时效果不甚满意,选中和放手的事件监听没有去正确的判断,然后渐变效果也比较单一,性能也觉得不是很快

ASP.NET MVC学习系列(二)-WebAPI请求

继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的get和post请求,我们在Web API中要如何来处理. 这里我使用Jquery 来发起异步请求实现数据调用. 继续使用上一文章中的示例,添加一个index.html页面,添加对jquery的引用. 一.无参数Get请求 一般的get请求我们可以使用jquery提供的$.get() 或者$.ajax({type:"get"}) 来实现: 请求的后台Action方法仍为上篇文章中的GetU

Caffe学习系列——工具篇:神经网络模型结构可视化

Caffe学习系列--工具篇:神经网络模型结构可视化 在Caffe中,目前有两种可视化prototxt格式网络结构的方法: 使用Netscope在线可视化 使用Caffe提供的draw_net.py 本文将就这两种方法加以介绍 1. Netscope:支持Caffe的神经网络结构在线可视化工具 Netscope是个支持prototxt格式描述的神经网络结构的在线可视工具,网址:  http://ethereon.github.io/netscope/quickstart.html  它可以用来可

Intelli IDEA学习系列之快捷键篇

Intelli IDEA学习系列之快捷键篇 IDEA简介: IDEA 全称IntelliJ IDEA,是java语言开发的集成环境,IntelliJ在业界被公认为最好的java开发工具之一,尤其在智能代码助手.代码自动提示.重构.J2EE支持.Ant.JUnit.CVS整合.代码审查. 创新的GUI设计等方面的功能可以说是超常的.IDEA是JetBrains公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主. 在学习过程中会慢慢补充..... [1.查找] 1

Java Web学习系列——Maven Web项目中集成使用Spring、MyBatis实现对MySQL的数据访问

本篇内容还是建立在上一篇Java Web学习系列——Maven Web项目中集成使用Spring基础之上,对之前的Maven Web项目进行升级改造,实现对MySQL的数据访问. 添加依赖Jar包 这部分内容需要以下Jar包支持 mysql-connector:MySQL数据库连接驱动,架起服务端与数据库沟通的桥梁: MyBatis:一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架: log4j:Apache的开源项目,一个功能强大的日志组件,提供方便的日志记录: 修改后的pom.xm

Oracle学习系列4

Oracle学习系列4 ************************************************************************************ 数据库更新操作: 分类: 查询操作:select 更新操作:insert ,update , delete 为了保存原始的emp表的信息,在进行增删改之前备份词表: create table emp_bak as select * from emp ; //将表emp结构和数据完整的复制出来 添加数据:

Oracle学习系列3

Oracle学习系列3 ************************************************************************************ 多表查询: 1,SQL1999语法对多表查询的支持 2,分组统计及统计函数的使用 3,子查询,并结合多表查询,分组统计做复杂查询 4,数据库的更新操作 5,事务处理和数据库死锁 ****************************************************************