NHibernate2.1中Flush的调用模式(转自http://blog.csdn.net/nileel/archive/2009/09/23/4583652.aspx)

本文主要是介绍NHibernate2.1中Flush的调用模式(转自http://blog.csdn.net/nileel/archive/2009/09/23/4583652.aspx),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

有很多NHibernate的初学者搞不清Flush()这个方法调用的时机和策略。

事实上,ISession有个叫FlushMode的属性,对其赋值即可控制调用Flush()的时机和策略。

那么具体赋什么值对应什么策略呢?NHibernate提供了一个枚举类型。其代码和注释如下:

using System;

namespace NHibernate
{
    // 摘要:
    //     Represents a flushing strategy.
    //
    // 备注:
    //     The flush process synchronizes database state with session state by detecting
    //     state changes and executing SQL statements
    //刷出通过检测状态变化和执行SQL状态来处理数据库状态与session状态之间的同步
    [Serializable]
    public enum FlushMode
    {
        // 摘要:
        //     Special value for unspecified flush mode (like null in Java).
        Unspecified = -1,
        //
        // 摘要:
        //     The ISession is never flushed unless Flush() is explicitly called by the
        //     application. This mode is very efficient for read only transactions
        //ISession(工作单元)绝不会被刷出除非应用程序明确地调用Flush()。这个模式对只读事务非常高效
        Never = 0,
        //
        // 摘要:
        //     The ISession is flushed when Transaction.Commit() is called
        //当Transaction.Commit()被调用时ISession(工作单元)会被刷出
        Commit = 5,
        //
        // 摘要:
        //     The ISession is sometimes flushed before query execution in order to ensure
        //     that queries never return stale state. This is the default flush mode.
        //查询执行前ISession(工作单元)会被不定时的刷出以确保查询绝不返回无效状态。这是默认的刷出模式
        Auto = 10,
        //
        // 摘要:
        //     The NHibernate.ISession is flushed before every query. This is almost always
        //     unnecessary and inefficient.
        //ISession(工作单元)在每个查询执行前被刷出。这个模式通常情况下几乎不需要并且效率非常低
        Always = 20,
    }
}

从以上代码和注释,我们可以很容易找到我们需要的答案。

中文注释部分为本人所翻译,E文水平有限,有什么不到位之处欢迎批评指正。

在默认的FlushMode下,flush() 会在下面的时间点执行:

  • 在某些Find() 或者Enumerable() 调用的时候

  • NHibernate.ITransaction.Commit() 的时候

  • ISession.Flush() 的时候

涉及的SQL语句会按照下面的顺序安排:

  1. 所有对实体进行插入的语句,其顺序按照对象执行ISession.Save() 的时间顺序

  2. 所有对实体进行更新的语句

  3. 所有进行集合删除的语句

  4. 所有对集合元素进行删除,更新或者插入的语句

  5. 所有进行集合插入的语句

  6. 所有对实体进行删除的语句,其顺序按照对象执行ISession.Delete() 的时间顺序

(有一个例外时,如果对象使用native 方式进行 ID 生成的话,它们一执行save就会被插入。)

除非你明确地发出了Flush() 指令,关于 ISession 合时会执行这些ADO.NET调用是完全无法保证的,只能保证它们执行的前后顺序。 当然,NHibernate保证, ISession.Find(..) 绝对不会返回已经失效的数据,也不会返回错误数据。

本来是想收藏的,但收藏后就再找就不太好找了。就直接转载。

这篇关于NHibernate2.1中Flush的调用模式(转自http://blog.csdn.net/nileel/archive/2009/09/23/4583652.aspx)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/948787

相关文章

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.

在C#中调用Python代码的两种实现方式

《在C#中调用Python代码的两种实现方式》:本文主要介绍在C#中调用Python代码的两种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#调用python代码的方式1. 使用 Python.NET2. 使用外部进程调用 Python 脚本总结C#调

SpringBoot如何通过Map实现策略模式

《SpringBoot如何通过Map实现策略模式》策略模式是一种行为设计模式,它允许在运行时选择算法的行为,在Spring框架中,我们可以利用@Resource注解和Map集合来优雅地实现策略模式,这... 目录前言底层机制解析Spring的集合类型自动装配@Resource注解的行为实现原理使用直接使用M

SpringCloud之LoadBalancer负载均衡服务调用过程

《SpringCloud之LoadBalancer负载均衡服务调用过程》:本文主要介绍SpringCloud之LoadBalancer负载均衡服务调用过程,具有很好的参考价值,希望对大家有所帮助,... 目录前言一、LoadBalancer是什么?二、使用步骤1、启动consul2、客户端加入依赖3、以服务

Vue 调用摄像头扫描条码功能实现代码

《Vue调用摄像头扫描条码功能实现代码》本文介绍了如何使用Vue.js和jsQR库来实现调用摄像头并扫描条码的功能,通过安装依赖、获取摄像头视频流、解析条码等步骤,实现了从开始扫描到停止扫描的完整流... 目录实现步骤:代码实现1. 安装依赖2. vue 页面代码功能说明注意事项以下是一个基于 Vue.js

Go语言中最便捷的http请求包resty的使用详解

《Go语言中最便捷的http请求包resty的使用详解》go语言虽然自身就有net/http包,但是说实话用起来没那么好用,resty包是go语言中一个非常受欢迎的http请求处理包,下面我们一起来学... 目录安装一、一个简单的get二、带查询参数三、设置请求头、body四、设置表单数据五、处理响应六、超

C#原型模式之如何通过克隆对象来优化创建过程

《C#原型模式之如何通过克隆对象来优化创建过程》原型模式是一种创建型设计模式,通过克隆现有对象来创建新对象,避免重复的创建成本和复杂的初始化过程,它适用于对象创建过程复杂、需要大量相似对象或避免重复初... 目录什么是原型模式?原型模式的工作原理C#中如何实现原型模式?1. 定义原型接口2. 实现原型接口3

大数据spark3.5安装部署之local模式详解

《大数据spark3.5安装部署之local模式详解》本文介绍了如何在本地模式下安装和配置Spark,并展示了如何使用SparkShell进行基本的数据处理操作,同时,还介绍了如何通过Spark-su... 目录下载上传解压配置jdk解压配置环境变量启动查看交互操作命令行提交应用spark,一个数据处理框架