dll文件懒加载_一步步学习NHibernate(5)——多对一,一对多,懒加载(2)

请注明转载地址:http://www.cnblogs.com/arhat

通过上一章的学习,我们建立了Student和Clazz之间的关联属性,并从Student(many)的一方查看了Clazz的信息,同时我们使用了懒加载技术和立即执行的方式来实现了对象的关联查询,那么在本章中,我们继续来研究“多对一,一对多,懒加载”的问题。

在本章中,我们从Clazz(one端)来发送查询请求,查询一下班级中Student学生信息。首先呢,我们把上一届中的两个映射文件的内容更改一下,让它启用一下懒加载,即把lazy设置为true或着是去掉(默认情况下,NHibernate是开启懒加载的)。

然后我们来查询一下班级为1的班级名称和这个班级中所有学生的信息。现在,我们添加一个D_Clazz类,内容如下:

public classD_Clazz

{public Model.Clazz GetClazz(intid)

{

ISession session=NHibernateHelper.OpenSession();return session.Get(id);

}

}

更改一下主程序的代码,注意这里需要在主程序中添加Iesi.Collection.dll的引用。

static void Main(string[] args)

{

DAL.D_Clazz dal= newDAL.D_Clazz();

Model.Clazz clazz=dal.GetClazz(1);

Console.WriteLine();

Console.WriteLine("班级名称:" +clazz.CName);

Console.WriteLine();foreach (Model.Student student inclazz.Students)

{

Console.WriteLine("学生:"+student.SName);

Console.WriteLine();

}

}

好,现在我们来运行一下,看看运行的结果如何。

我们已经成功的使用懒加载来查询出Clazz关联的属性。从上面的结果来看,NHibernate发出了两条SQL语句。当让这个懒加载之所以能够成功的查询,是因为我们没有释放ISession的资源。那么现在我们不适用懒加载来查询一下,看看有什么区别没有!我们更改一下D_Clazz的代码:

public Model.Clazz GetClazz(intid)

{//ISession session = NHibernateHelper.OpenSession();//return session.Get(id);

using (ISession session =NHibernateHelper.OpenSession())

{return session.Get(id);

}

}

同时我们更改Clazz.hbm.xml,把的懒加载去掉,也就是lazy=false。

然后运行一下程序看看结果。

此时,我们发现,当使用“立即执行”的时候,NHibernate会发出两条SQL语句,而这两条SQL语句是同时执行的和上面懒加载相比,是不是影响效率了呢?上面懒加载的时候,是当我们需要的时候,才发出第二条语句,而“立即执行”是不管你有没有用,我全部给你查询出来。大家可以试想一下,这样不就是浪费我们昂贵的内存资源吗?如果用得上的话那就不说什么了,问题如果我们用不上则不久白白浪费我们的资源了嘛!

而且在我们传统的思想中,我们应该是使用完资源后要立即释放,但是要使用NHibernate懒加载的时候却要求不能释放资源,这个不就是矛盾嘛。这个该怎么办呢?幸运的是,NHiberante为我们提供了一个NHibernateUtil的工具类,这个工具类中有一个方法非常的游泳,就是Initializ方法,这个方法是使用一个代理来帮我们初始化未初始化的对象。有个这个方法,我们就可以两者兼得了,既可以使用懒加载,也可以释放ISession资源。首先,我们下把hbm.xml中的lazy=false全部去掉。然后改写一下D_Clazz的代码:

public Model.Clazz GetClazz(intid)

{//ISession session = NHibernateHelper.OpenSession();//return session.Get(id);

using (ISession session =NHibernateHelper.OpenSession())

{

Model.Clazz clazz= session.Get(id);

NHibernateUtil.Initialize(clazz.Students);returnclazz;

}

}

我们在得到Clazz对象的时候,并没有急着返回,而是使用了NHibernateUtil.Initialize方法来初始化Students这个集合。然后在返回clazz对象,此时的clazz对象中就有了Students这个集合对象了。

下面是运行的结果图,发现和使用lazy=false的效果是一样的。

其实,NHiberante在懒加载的问题上真是个头疼的问题,就好比鱼和熊掌不能兼得,要么使用懒加载但是不能及时的释放对象,要么就是使用“立即执行”占用大量的资源。

在NHibernate中,其实提到一个这种的办法就是使用Open Session In View的概念,只不过这概念只能在Web应用程序中才能用,如果是Winform的话,不好意思,老魏还这没找到一个合适的方法。不过老魏相信后续的NHibernate可能会解决这个问题的。

所以在使用NHibernate的时候,什么时候使用懒加载,什么时候不使用是个非常重要的问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/433681.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python代码加密 混淆_Python程序的混淆和加密

混淆 为了增加代码阅读的难度, 源代码的混淆非常必要, 一个在线的Python代码混淆网站. 如果你觉得有用, 可以购买离线版本. 同时需要注意的是, 这个混淆其实还是被很多人怀疑的, 因为即使混淆了, 也没有改变代码的结构. 所以, 必要的话, 在编程的时候, 可以故意做点提高逆向难度…

[活动通知]Nanjing GDG 2013年4月活动

致各位亲爱的 Google 技术爱好者 很高兴的通知各位朋友,Nanjing GDG 将在本周日 (04/21) 举办我们 Nanjing GDG 的 4月份活动,热烈欢迎大家报名参加。 主题:利用开放社区和代码库来构建 Android 应用 时间: 4月21 日 (周日) 下午 …

python linux运维教程 推荐_Linux运维人员成长之路学习书籍推荐

原标题:Linux运维人员成长之路学习书籍推荐一、入门书:《鸟哥的私房菜(基础篇)》《鸟哥的私房菜(服务篇)》《Linux命令行与Shell脚本编程大全(第2版)》《UNIX/Linux 系统管理技术手册》《UNIX编程艺术》二、计算机及操作系统原理书:《深入理解…

MySQL笔记——外键约束和表关系(一对一,多对一,多对多)

一、外键约束 概念:外键用来让两个表的数据之间建立链接,保证数据的一致性和完整性。语法:(1)添加约束-- 创建表是添加外键约束CREATE TABLE 表名(列名 数据类型,…[CONSTRAINT] [外键名称] FOREIGN KEY(外键列名) REF…

asterisk 学习笔记1

一: Asterisk为特定的目标指定了一些extension名称。 i:Invalid s:Start h:Hangup t:Timeout T:AbsoluteTimeout o:Operator 一般常用的是i和t 二: asterisk拨号方案的调试可以用NoOp()函数,这个函数什么也不做,…

hashCode()方法的作用使用分析

一直以来都想写篇文章来说明下hashCode的作用以及相关的知识,许久没动笔,最近找了点资料,自己整理了一下,于是就诞生了下面的东西! (1)前言,想要明白hashCode的作用,你必须要先知道Java中的集合…

仿个人税务 app html5_【注意】你下载的可能是个假的个税App

新个税法从1月初开始实施。国家税务总局推出“个人所得税”APP,方便纳税人线上填报资料进行专项抵扣。几天来,这款APP的下载量和注册量大幅增长。随之而来的是,很多商业公司制作的各类“个税”APP也成为热门。这其中有不少纯属蹭热点&#xf…

MySQL笔记——多表查询

多表查询不能使用 SELECT * from emp, dept; 会产生笛卡尔积。 笛卡尔积,有A,B两个集合,A中有5条信息,B中有4条信息,那么查询结果就是5*420条一、内连接查询 -- 隐式内连接SELECT 字段列表 FROM 表1,表2,… WHERE 条件…

遇见王沥川的人生感悟_23岁酱油泡饭默默无闻,31岁逆袭人生,王彦霖有何魅力?...

文/小白说娱S姐 原创精品,请勿转载如果兜里只剩下1块钱,生活所迫你会怎样过?王彦霖23岁刚毕业熬过了1元危机,他永远都不会想到当年咬牙坚持熬成就了如今的综艺诸葛。《元气满满的哥哥》连播六期多次排名第一,成为芒果台…

antd vue form 手动校验_参与《开课吧》vue训练营笔记(Day1)

大神说的目标:Vue 挑战20k组件间通信component 官网 详解组件间的传递方式:父传子 直接属性传递子传父 this.$emit 时间传递兄弟组件 利用父组件搭桥组件和子孙 provide / inject子孙 -> 祖先 this.$dispatch 或provide 获取组件元素实例$listeners $…

细学PHP 14 mysql-4

预留转载于:https://www.cnblogs.com/cnmice/archive/2013/04/17/3027102.html

Asterisk针对Mysql的extconfig.conf配置

Asterisk针对Mysql的extconfig.conf配置,这其中涉及到的表的structure [setting] sipusers > mysql,general,sip_buddies sippeers > mysql,general,sip_buddies queues > mysql,general,queue_table queue_members >mysql,general,queue_member_tabl…

ipfs 云服务器_IPFS加速云服务生机和分布式存储

如果能把一个安卓系统或IOS系统安装到分布式存储里,不管人们在做什么,各项数据都可以通过面部识别就可以确认ID,数据的响应性快,安全性和便捷性更高。IPFS的节点上,未来访问网站不再需要HTTP,而是IPFS。分布…

MySQL笔记——打开日志

在my.ini文件中输入如下命令:log_outputFILE general_logon general_log_file"D:\\SoftwareTools\\Mysql\\mysqllog\\mysql.log" slow_query_logon long_query_time 2 slow_query_log_file"D:\\SoftwareTools\\Mysql\\mysqllog\\mysql_slow.log"…

链表怎么输出最后一个元素无空格_剑指offer系列----从尾到头打印链表

从尾到头打印链表信息卡片时间:2020-03-23题目:从尾到头打印链表tag:list题目描述输入一个链表,按链表从尾到头的顺序返回一个 ArrayList。01调用 reverse 函数解题思路这是一种简单粗暴的解法。先遍历一遍链表,在遍历…

a20_v2.0_k70运行在xhda20开发板

修改sys_config.fex文件两个地方 [clock] pll3 297 pll4 300 pll6 600 pll7 297 pll8 336 [dram_para] dram_baseaddr 0x40000000 dram_clk 408 d…

EntiyFramework :Update model from database引起的两个问题

EntiyFramework一大特点就是Code first,但难免有时候因特殊原因需要Update model from database。此次使用该功能时遇到两个问题,且记之。 [问题一] Error 3027: No mapping specified for the following EntitySet/AssociationSet - XXXXXXX. [起因] 在…

MySQL笔记——JDBC入门

(一)JDBC简介 JDBC概念:(1)JDBC就是使用Java语言操作关系型数据库的一套API(2)全称:(Java DataBase Connectivity)Java数据库连接(二)…

python统计汉字个数是_Python中文词频统计

今天看到的一个统计,统计的金庸小说里面的高频词语。想着看了一周python,试试看能不能统计。 网上找的代码,调整顺序拼接了一下,分词库是结巴分词。 解决了python2.7中字典显示中文乱码的问题 分词代码:https://github…

cpu个数核数查看 服务器_服务器如何查看cpu核数

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":6,"count":6}]},"card":[{"des":"云服务器 ECS(Elastic Compute Service)是一…