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

相关文章

SpringBoot中HTTP连接池的配置与优化

《SpringBoot中HTTP连接池的配置与优化》这篇文章主要为大家详细介绍了SpringBoot中HTTP连接池的配置与优化的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录一、HTTP连接池的核心价值二、Spring Boot集成方案方案1:Apache HttpCl

Spring Boot Controller处理HTTP请求体的方法

《SpringBootController处理HTTP请求体的方法》SpringBoot提供了强大的机制来处理不同Content-Type​的HTTP请求体,这主要依赖于HttpMessageCo... 目录一、核心机制:HttpMessageConverter​二、按Content-Type​处理详解1.

Redis高可用-主从复制、哨兵模式与集群模式详解

《Redis高可用-主从复制、哨兵模式与集群模式详解》:本文主要介绍Redis高可用-主从复制、哨兵模式与集群模式的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录Redis高可用-主从复制、哨兵模式与集群模式概要一、主从复制(Master-Slave Repli

使用easy connect之后,maven无法使用,原来需要配置-Djava.net.preferIPv4Stack=true问题

《使用easyconnect之后,maven无法使用,原来需要配置-Djava.net.preferIPv4Stack=true问题》:本文主要介绍使用easyconnect之后,maven无法... 目录使用easGWowCy connect之后,maven无法使用,原来需要配置-DJava.net.pr

一文带你搞懂Redis Stream的6种消息处理模式

《一文带你搞懂RedisStream的6种消息处理模式》Redis5.0版本引入的Stream数据类型,为Redis生态带来了强大而灵活的消息队列功能,本文将为大家详细介绍RedisStream的6... 目录1. 简单消费模式(Simple Consumption)基本概念核心命令实现示例使用场景优缺点2

Java调用Python的四种方法小结

《Java调用Python的四种方法小结》在现代开发中,结合不同编程语言的优势往往能达到事半功倍的效果,本文将详细介绍四种在Java中调用Python的方法,并推荐一种最常用且实用的方法,希望对大家有... 目录一、在Java类中直接执行python语句二、在Java中直接调用Python脚本三、使用Run

Python如何调用指定路径的模块

《Python如何调用指定路径的模块》要在Python中调用指定路径的模块,可以使用sys.path.append,importlib.util.spec_from_file_location和exe... 目录一、sys.path.append() 方法1. 方法简介2. 使用示例3. 注意事项二、imp

在.NET平台使用C#为PDF添加各种类型的表单域的方法

《在.NET平台使用C#为PDF添加各种类型的表单域的方法》在日常办公系统开发中,涉及PDF处理相关的开发时,生成可填写的PDF表单是一种常见需求,与静态PDF不同,带有**表单域的文档支持用户直接在... 目录引言使用 PdfTextBoxField 添加文本输入域使用 PdfComboBoxField

C#如何调用C++库

《C#如何调用C++库》:本文主要介绍C#如何调用C++库方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录方法一:使用P/Invoke1. 导出C++函数2. 定义P/Invoke签名3. 调用C++函数方法二:使用C++/CLI作为桥接1. 创建C++/CL

Nginx location匹配模式与规则详解

《Nginxlocation匹配模式与规则详解》:本文主要介绍Nginxlocation匹配模式与规则,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、环境二、匹配模式1. 精准模式2. 前缀模式(不继续匹配正则)3. 前缀模式(继续匹配正则)4. 正则模式(大