<a href="http://www.cnblogs.com/wolf-sun/p/4082432.html#t1" target="_blank">写在前面</a>
<a href="http://www.cnblogs.com/wolf-sun/p/4082432.html#t2" target="_blank">文档与系列文章</a>
<a href="http://www.cnblogs.com/wolf-sun/p/4082432.html#t3" target="_blank">立即加载</a>
<a href="http://www.cnblogs.com/wolf-sun/p/4082432.html#t4" target="_blank">一个例子</a>
<a href="http://www.cnblogs.com/wolf-sun/p/4082432.html#t5" target="_blank">总结</a>
上篇文章介绍了nhibernate延迟加载的相关内容,简单回顾一下延迟加载,就是需要的时候再去加载,需要的时候再向数据库发出sql指令进行查询。
本篇文章介绍的立即加载,则和延迟加载相对,举个简单的例子,就是查询客户信息,则会将该客户相关联的数据立即进行加载。实现立即加载的方式有三种:设置映射文件中节点的可选属性lazy,nhibernate提供的实用类,hql抓取策略。
<a href="http://www.cnblogs.com/wolf-sun/p/3694592.html">[nhibernate]体系结构</a>
<a href="http://www.cnblogs.com/wolf-sun/p/3694901.html">[nhibernate]isessionfactory配置</a>
<a href="http://www.cnblogs.com/wolf-sun/p/3704012.html">[nhibernate]持久化类(persistent classes)</a>
<a href="http://www.cnblogs.com/wolf-sun/p/3705229.html">[nhibernate]o/r mapping基础</a>
<a href="http://www.cnblogs.com/wolf-sun/p/3720259.html">[nhibernate]关联映射</a>
<a href="http://www.cnblogs.com/wolf-sun/p/3721528.html">[nhibernate]parent/child</a>
<a href="http://www.cnblogs.com/wolf-sun/p/3724052.html">[nhibernate]缓存(nhibernate.caches)</a>
<a href="http://www.cnblogs.com/wolf-sun/p/3734249.html">[nhibernate]nhibernate.tool.hbm2net</a>
<a href="http://www.cnblogs.com/wolf-sun/p/3734313.html">[nhibernate]nullables</a>
<a href="http://www.cnblogs.com/wolf-sun/p/3956802.html">[nhibernate]nhibernate如何映射sqlserver中image字段</a>
<a href="http://www.cnblogs.com/wolf-sun/p/4046672.html">[nhibernate]条件查询criteria query</a>
<a href="http://www.cnblogs.com/wolf-sun/p/4048048.html">[nhibernate]增删改操作</a>
<a href="http://www.cnblogs.com/wolf-sun/p/4049716.html">[nhibernate]事务</a>
<a href="http://www.cnblogs.com/wolf-sun/p/4050714.html">[nhibernate]并发控制</a>
<a href="http://www.cnblogs.com/wolf-sun/p/4067026.html">[nhibernate]组件之依赖对象</a>
<a href="http://www.cnblogs.com/wolf-sun/p/4068749.html">[nhibernate]一对多关系(级联删除,级联添加)</a>
<a href="http://www.cnblogs.com/wolf-sun/p/4070935.html">[nhibernate]一对多关系(关联查询)</a>
<a href="http://www.cnblogs.com/wolf-sun/p/4074654.html">[nhibernate]多对多关系(关联查询)</a>
<a href="http://www.cnblogs.com/wolf-sun/p/4077226.html">[nhibernate]延迟加载</a>
1、一对多关系
通过立即加载的方式,加载客户信息及客户的订单信息。


1.1、修改customer.hbm.xml文件
因为nhibernate默认是使用lazy的方式加载数据的,也就是默认lazy=“true”的,需要显示的指定lazy=“false”。
编写一个测试验证,调用数据访问层中的使用using强制资源清理session加载customer对象的方法加载一个customer对象,nhibernate这时立即加载customer相关联的order对象。
利用nhibernate提供实用类(nhibernateutil)测试被关联的customer对象集合是否已初始化(也就是已加载)。
上篇文章中也说明了,如果在关闭session的情况下,如果你展开customer的orders属性,就会出现异常
这也说明了orders是跟customer一样立即加载的。
查看生成的sql语句
第一条sql为查询customer的,第二条sql是查询与该customer相关联的order的。
1.2、使用nhibernateutil实用类
nhibernate提供实用类(nhibernateutil)可以用来检测被关联的对象集合是否已初始化,还可以强制初始化未初始化的相关联的对象。有了这个功能,我们就可以修改数据访问层中的方法,把上面使用using强制清理关闭session的方法中加上nhibernateutil类提供initialize方法来初始化customer相关联的order对象集合。
修改customer.hbm.xml文件,将set节点的lazy属性设置为默认值true,或者删除该属性。


通过该种方式,跟上面的测试结果相同,就不再贴图了。
2、多对多关系
2.1、使用lazy=“false”属性
例子同上面的类似,就不再赘述。
2.2、使用nhibernateutil实用类
这里采用order和product多对多实例进行分析。
如果想在加载order的情况下,加载该order下的所有product,可以使用nhibernateutil类初始化关联对象(把他们从数据库取出来)。


测试


这里生成了三条sql语句,查询和order关联的customer和product。
2.3使用hql抓取策略
hql语句支持的连接类型为:inner join(内连接)、left outer join(左外连接)、right outer join(右外连接)、full join(全连接,不常用)。
“抓取fetch”连接允许仅仅使用一个选择语句就将相关联的对象随着他们的父对象的初始化而被初始化,可以有效的代替了映射文件中的外联接与延迟属性声明。
几点注意: fetch不与setmaxresults() 或setfirstresult()共用,因为这些操作是基于结果集的,而在预先抓取集合时可能包含重复的数据,也就是说无法预先知道精确的行数。 fetch还不能与独立的with条件一起使用。通过在一次查询中fetch多个集合,可以制造出笛卡尔积,因此请多加注意。对多对多映射来说,同时join fetch多个集合角色可能在某些情况下给出并非预期的结果,也请小心。 使用full join fetch 与 right join fetch是没有意义的。 如果你使用属性级别的延迟获取,在第一个查询中可以使用 fetch all properties 来强制nhibernate立即取得那些原本需要延迟加载的属性。
测试代码


生成的sql语句
这篇文章介绍了nhibernate立即加载的方式,什么时候使用立即加载,什么时候使用延迟加载,视项目中的情况而定。
博客地址:
<a href="http://www.cnblogs.com/wolf-sun">http://www.cnblogs.com/wolf-sun/</a>
博客版权:
本文以学习、研究和分享为主,欢迎转载,但必须在文章页面明显位置给出原文连接。
如果文中有不妥或者错误的地方还望高手的你指出,以免误人子弟。如果觉得本文对你有所帮助不如【推荐】一下!如果你有更好的建议,不如留言一起讨论,共同进步!
再次感谢您耐心的读完本篇文章。
转载:http://www.cnblogs.com/wolf-sun/p/4082432.html