Nhibernate(英文冬眠的意思) 常用方法

Contains

Evict

Clear

 在 NHibernate 中一切必须是 Virtual 的吗?

http://www.cnblogs.com/aaa6818162/p/4675279.html

http://blog.zhaojie.me/2009/09/my-view-of-nhibernate-2-virtually-everything.html

因此,如果是你的话,在写Java代码的时候,是愿意使用getXxx()这样的方法,还是直接访问类中的私有字段?因此我认为,是Java语言的特性,导致Java开发人员倾向于直接访问类中的私有字段,从而导致Hibernate需要避免未加载的私有字段,进一步导致Hibernate的代理类会去覆盖所有的公开方法(只有方法,因为Java语言没有“属性”)——最终,由于NHibernate在“统一大业”上的策略,使得我们.NET开发人员也必须把所有成员标记为virtual,无论是方法还是属性。

 Nhibernate API

http://www.cnblogs.com/aaa6818162/p/4639308.html

下图描述了NHibernate的API在分层架构中的作用,下面将进行详细说明。

NHibernate的接口大致分为四类:

1.  被应用程序调用进行基本数据操作(增、删、改、查)的接口。这些接口是应用程序的业务逻辑层和控制层与NHibernate的主要交互点。ISession, ITransaction, IQuery和ICriteria属于此类。

2. 被应用程序用来配置NHibernate的接口。Configuration就属此类。

3. 回调接口。应用程序用回调接口来响应NHibernate中触发的事件。这类接口包括Interceptor, ILifecycle和IValidatable等。

4. 用于扩展NHibernate的强大映射功能的接口。这类接口通常被应用程序的基础架构来实现。IUserType, ICompositeUserType, 和IIdentifierGenerator属于此类。

 NHibernate Interceptor机制

nhibernate是如何自动生成sql语句的

NHibernate 查看生成的sql语句:
其实就是Interceptor的应用,  源码中Interceptor的默认实现是EmptyInterceptor,
[Serializable]
public class EmptyInterceptor : IInterceptor
{   //前面省略n行代码
  public SqlString OnPrepareStatement(SqlString sql)
  {
   return sql;
  }
}  public class MyInterceptor : EmptyInterceptor
    {
       public override NHibernate.SqlCommand.SqlString OnPrepareStatement(NHibernate.SqlCommand.SqlString sql)
        {
            return base.OnPrepareStatement(sql);
        }
    } 我们要做的就是继承EmptyInterceptor,重写OnPrepareStatement()方法,重写方法里面就是你大展拳脚的地方了,
想写文件写文件,想输出到页面就输出到页面,什么都不做都可以,如上
怎么用呢?
  public override void Update(Admin entity)
        {
            ISession session = HibernateTemplate.SessionFactory.OpenSession(new MyIntercepotr);
            session.Update(entity);
            session.Flush();
        }
在你想要查看的操作中,打开session 的时候添加上自定义的拦截器就可以了,想给所有的操作都配置的话就要用到全局配置文件了。
重写OnPrepareStatement()的时候一句话都不改,我只是在这里打一个断点而已,只要看看生成的sql语句就行了,然后去修改配置文件再来debug,确认怎么配置生产的sql最优。

http://www.cnblogs.com/jiezhi/articles/87414.html

http://www.cnblogs.com/JeffreyZhao/archive/2009/10/13/my-view-of-nhibernate-4-interceptor.html

 NHibernate中Session是线程不安全(多线程中Session不能被共享)  http://www.cnblogs.com/aaa6818162/p/4631412.html
 Nhibernate 设置派生属性

http://www.cnblogs.com/cnjava/archive/2012/07/21/2602294.html

映射属性

作用

<property>元素的insert属性

如果为false,在insert语句中不包含该字段,表明该字段永远不能被插入。默认值为true

<property>元素的update属性

如果为false,update语句中不包含该字段,表明该字段永远不能被更新,默认值为true

<class>元素的mutable属性

如果为false,等价于所有的<property>元素的update属性为false,表示整个实例不能被更新,默认值为true

<property>元素的dynamic-insert属性

如果为true,表示当保存一个对象时,会动态生成insert语句,只有这个字段取值不能为null,才会把它包含到insert语句中。默认值为false

<property>元素的dynamic-update属性

如果为true,表示当更新一个对象时,会动态生成update语句,只有该字段取值不为null,才会把它包含到update语句中。默认值为false

<class>元素的dynamic-insert属性

如果为true,等价于所有的<property>元素的dynamic-insert属性为true,表示当保存一个对象时,会动态生成insert语句,insert语句中仅包含所有取值不为null的字段。默认值为false

<class>元素的dynamic-update属性

如果为true,等价于所有的<property>元素的dynamic-update属性为true,表示当保存一个对象时,会动态生成update语句,update语句中仅包含所有取值不为null的字段。默认值为false

NHibernate主键生成方式   Key Generator

 关系数据库中的主键可分为 自然主键(具有业务含义)和代理主键(不具有业务含义)
 Nhibernate锁 数据并发 版本号   http://www.cnblogs.com/lyj/archive/2008/10/21/1316269.html

Nhibernate 一级缓存

 
 NHibernate的Session管理策略   http://www.cnblogs.com/13yan/archive/2013/05/17/3083552.html

1)在Web应用程序中 一个请求中第一次会打开一个Session并保存再web上下文,以后就不再新打开了

2)在WinForm或单元测试中,使用另一种策略,每个线程用一个Session。

修改hibernate.cfg.xml配置文件,加入一个属性<property name="current_session_context_class">web</property>,修改这个属性就可以修改Session策略。

sessionFactory = new Configuration().Configure()
                .SetProperty("current_session_context_class", currentSessionContextClass.ToString())
                .BuildSessionFactory();

 NHibernate 怎么样去为我们的实体类设置一个通用的基类   http://www.cnblogs.com/aaa6818162/p/4631443.html
 hibernate session的flushMode的区别

http://blog.csdn.net/looyo/article/details/6309136

http://stackoverflow.com/questions/3295169/nhibernate-flushmode-auto-not-flushing-before-find

session.flushmode=auto
1.手动调用flush()
2.commit()时候
3.查询前 (经过测试(oracle驱动),必须在事务内,不确定是否全部情形)

/// <summary>
        ///  FlushMode.Auto  entity2返回值  list返回值
        /// FlushMode.Commit entity2 null  list null
        /// 调用Session的查询方法时,清理缓存,注意:这条规则必须保证显式开启的事务中,对于outside a transaction
        /// </summary>
        /// <returns></returns>
        public void FlushModeAutoTestMethod3()
        {
            ISession session = SessionFactoryManager.SessionFactory.OpenSession();
            session.FlushMode = FlushMode.Commit;
            var tx = session.BeginTransaction();
            Cardtype entity = new Cardtype() { Cardtypename = "33" };
            session.Save(entity);

Cardtype entity2 = session
                    .CreateQuery("from Cardtype where Cardtypename = '33'")
                    .List<Cardtype>()
                    .FirstOrDefault();

entity.Cardtypename = "66";
            var list = session.CreateQuery("from Cardtype where Cardtypename = '66'").List<Cardtype>().Count();
            session.Flush();
            tx.Commit();
        }

 NHibernate中Get和Load的区别  1.get()采用立即加载方式,而load()采用延迟加载;

get()方法执行的时候,会立即向数据库发出查询语句,
   而load()方法返回的是一个代理(此代理中只有一个id属性),只有等真正使用该对象属性的时候,才会发出sql语句
2.如果数据库中没有对应的记录,get()方法返回的是null.而load()方法出现异常ObjectNotFoundException

如果加载一个对象的目的是威力访问它的属性,可以用get方法

如果加载一个对象的目的是为了删除它,或者是为了建立于别的对象的关联,可以用load

 域对象在持久化层的三种状态 

临时状态(Transient):当new一个实体对象后,这个对象处于临时状态,即这个对象只是一个保存临时数据的内存

区域,如果没有变量引用这个对象,则会被jre垃圾回收机制回收。这个对象所保存的数据

与数据库没有任何关系,除非通过Session的save或者SaveOrUpdate把临时对象与数据库

关联,并把数据插入或者更新到数据库,这个对象才转换为持久对象。

持久状态(Persistent): 持久化对象的实例在数据库中有对应的记录,并拥有一个持久化表示(ID)。对持久化对

象进行delete操作后,数据库中对应的记录将被删除,那么持久化对象与数据库记录不再

存在对应关系,持久化对象变成临时状态。持久化对象被修改变更后,不会马上同步到数

据库,直到数据库事务提交。在同步之前,持久化对象是脏的(Dirty)。

游离状态(Detached):当Session进行了Close、Clear或者evict后,持久化对象虽然拥有持久化标识符和与数据

库对应记录一致的值,但是因为会话已经消失,对象不在持久化管理之内,所以处于游离

状态(也叫:脱管状态)。游离状态的对象与临时状态对象是十分相似的,只是它还含有

持久化标识。

总结:我们现在系统默认取出来的对象一直在持久状态 因为session绑定的web上线文  只有请求结束才进行session的close

protected void Application_BeginRequest(object sender, EventArgs e)
        {
            ISession session = SessionFactoryBizCom.GetInstance().OpenSession();
            session.FlushMode = FlushMode.Auto;
            CurrentSessionContext.Bind(session);
        }

protected void Application_EndRequest(object sender, EventArgs e)
        {
            if (CurrentSessionContext.HasBind(SessionFactoryBizCom.GetInstance().GetessionFactory()))
            {
                ISession session = CurrentSessionContext.Unbind(SessionFactoryBizCom.GetInstance().GetessionFactory());
                //session.Flush();
                //session.Close();
                session.Dispose();
            }
        }

   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   

Nhibernate基础的更多相关文章

  1. Nhibernate基础使用教程以及简易封装

    1.Nhibernate简介 NHibernate是一个面向.NET环境的对象/关系数据库映射工具.对象/关系数据库映射(object/relational mapping,ORM)这个术语表示一种技 ...

  2. NHibernate 基础

    install-package nhibernate install-package nunit Customer.cs public class Customer { public virtual ...

  3. 3. NHibernate基础知识 - 你必须知道的一些事情

    首先介绍一下框架结构(这个有个概念就可以): 然后我们会介绍一个很重要的概念(一定要好看)!! 这节对 NHibernate 架构做一个介绍,首先要了解一下该框架在应用程序中的位置: 先来一个简单的图 ...

  4. NHibernate 基础教程

    NHibernate之旅系列文章导航 宣传语 NHibernate.NHibernate教程.NHibernate入门.NHibernate下载.NHibernate教程中文版.NHibernate实 ...

  5. NHibernate官方文档中文版--基础ORM(Basic O/R Mapping)

    映射声明 对象/关系映射在XML文件中配置.mapping文件这样设计是为了使它可读性强并且可修改.mapping语言是以对象为中心,意味着mapping是围绕着持久化类声明来建立的,而不是围绕数据表 ...

  6. NHibernate之映射文件配置说明

    NHibernate之映射文件配置说明 1. hibernate-mapping 这个元素包括以下可选的属性.schema属性,指明了这个映射所引用的表所在的schema名称.假若指定了这个属性, 表 ...

  7. NHibernate系列文章目录

    第一章:NHibernate基础 NHibernate介绍 第一个NHibernate工程 简单的增删改查询 运行时监控 NHibernate配置 数据类型映射 Get/Load方法 NHiberna ...

  8. NHibernate系列文章二十八:NHibernate Mapping之Auto Mapping(附程序下载)

    摘要 上一篇文章介绍了Fluent NHibernate基础知识.但是,Fluent NHibernate提供了一种更方便的Mapping方法称为Auto Mapping.只需在代码中定义一些Conv ...

  9. [转]NHibernate之映射文件配置说明

    1. hibernate-mapping 这个元素包括以下可选的属性.schema属性,指明了这个映射所引用的表所在的schema名称.假若指定了这个属性, 表名会加上所指定的schema的名字扩展为 ...

随机推荐

  1. windows上自动设置java环境变量的脚本

    近期打算学习安卓开发,于是乎要准备java开发环境,安装好jdk后,就要设置java环境变量,java环境变量要设置JAVA_HOME,Path,CLASSPATH三个值,每次配置查百度复制粘贴都很麻 ...

  2. 12 个 Web 设计师必备的 Bootstrap 工具

    转自:http://www.oschina.net/translate/12-best-bootstrap-tools-for-web-designers Bootstrap是一个非常棒的前端网站开发 ...

  3. C#设计模式(19)——状态者模式(State Pattern)

    一.引言 在上一篇文章介绍到可以使用状态者模式和观察者模式来解决中介者模式存在的问题,在本文中将首先通过一个银行账户的例子来解释状态者模式,通过这个例子使大家可以对状态者模式有一个清楚的认识,接着,再 ...

  4. 享受LINQ:判断一组文字是否在字符串中同时出现的最简单方法

    需求是这样的:不允许在一个字符串中同时出现"博", "客", "园", "团", "队"这5个文字. ...

  5. WEB项目后端跨域请求

    using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net ...

  6. Python模拟HTTP Post上传文件

    使用urllib2模块构造http post数据结构,提交有文件的表单(multipart/form-data),本示例提交的post表单带有两个参数及一张图片,代码如下: #buld post bo ...

  7. Twitter API升级至1.1

    Twitter API 1.1是至今最大的一次升级,从3月份提出,到6月11日1.0版本已经全面停止调用.关于1.1版本升级特性可访问: https://dev.twitter.com/docs/ap ...

  8. 亚马逊云服务之CloudFormation

    亚马逊的Web Service其实包含了一套云服务.云服务主要分为三种: IaaS: Infrastructure as a service,基础设施即服务. PaaS: Platform as a ...

  9. spring常用jar包总结(转载)

    spring.jar是包含有完整发布的单个jar 包,spring.jar中包含除了spring-mock.jar里所包含的内容外其它所有jar包的内容,因为只有在开发环境下才会用到 spring-m ...

  10. 仿Material UI框架的动画特效

    Material UI是一款功能非常强大,界面却十分清新简洁的CSS框架,Material UI利用了Google的Material Design 全新设计语言,并且让每一个UI组件都变得非常独立,因 ...