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

相关文章

C#利用Free Spire.XLS for .NET复制Excel工作表

《C#利用FreeSpire.XLSfor.NET复制Excel工作表》在日常的.NET开发中,我们经常需要操作Excel文件,本文将详细介绍C#如何使用FreeSpire.XLSfor.NET... 目录1. 环境准备2. 核心功能3. android示例代码3.1 在同一工作簿内复制工作表3.2 在不同

MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决

《MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决》MyBatis默认开启一级缓存,同一事务中循环调用查询方法时会重复使用缓存数据,导致获取的序列主键值均为1,... 目录问题原因解决办法如果是存储过程总结问题myBATis有如下代码获取序列作为主键IdMappe

使用Go调用第三方API的方法详解

《使用Go调用第三方API的方法详解》在现代应用开发中,调用第三方API是非常常见的场景,比如获取天气预报、翻译文本、发送短信等,Go作为一门高效并发的编程语言,拥有强大的标准库和丰富的第三方库,可以... 目录引言一、准备工作二、案例1:调用天气查询 API1. 注册并获取 API Key2. 代码实现3

在.NET项目中嵌入Python代码的实践指南

《在.NET项目中嵌入Python代码的实践指南》在现代开发中,.NET与Python的协作需求日益增长,从机器学习模型集成到科学计算,从脚本自动化到数据分析,然而,传统的解决方案(如HTTPAPI或... 目录一、CSnakes vs python.NET:为何选择 CSnakes?二、环境准备:从 Py

Nginx部署HTTP/3的实现步骤

《Nginx部署HTTP/3的实现步骤》本文介绍了在Nginx中部署HTTP/3的详细步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录前提条件第一步:安装必要的依赖库第二步:获取并构建 BoringSSL第三步:获取 Nginx

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1

HTTP 与 SpringBoot 参数提交与接收协议方式

《HTTP与SpringBoot参数提交与接收协议方式》HTTP参数提交方式包括URL查询、表单、JSON/XML、路径变量、头部、Cookie、GraphQL、WebSocket和SSE,依据... 目录HTTP 协议支持多种参数提交方式,主要取决于请求方法(Method)和内容类型(Content-Ty

Python 基于http.server模块实现简单http服务的代码举例

《Python基于http.server模块实现简单http服务的代码举例》Pythonhttp.server模块通过继承BaseHTTPRequestHandler处理HTTP请求,使用Threa... 目录测试环境代码实现相关介绍模块简介类及相关函数简介参考链接测试环境win11专业版python

使用Python的requests库来发送HTTP请求的操作指南

《使用Python的requests库来发送HTTP请求的操作指南》使用Python的requests库发送HTTP请求是非常简单和直观的,requests库提供了丰富的API,可以发送各种类型的HT... 目录前言1. 安装 requests 库2. 发送 GET 请求3. 发送 POST 请求4. 发送

Java调用Python脚本实现HelloWorld的示例详解

《Java调用Python脚本实现HelloWorld的示例详解》作为程序员,我们经常会遇到需要在Java项目中调用Python脚本的场景,下面我们来看看如何从基础到进阶,一步步实现Java与Pyth... 目录一、环境准备二、基础调用:使用 Runtime.exec()2.1 实现步骤2.2 代码解析三、