天天看点

[NHibernate]延迟加载

<a href="http://www.cnblogs.com/wolf-sun/p/4077226.html#t1" target="_blank">写在前面</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4077226.html#t2" target="_blank">文档与系列文章</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4077226.html#t3" target="_blank">延迟加载</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4077226.html#t4" target="_blank">一个例子</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4077226.html#t5" target="_blank">总结</a>

上篇文章介绍了多对多关系的关联查询的sql,hql,criteria查询的三种方式。本篇文章将介绍nhibernate中的延迟加载方式,延迟加载按个人理解也可以叫做按需要加载(loading-on-demand)。

<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>

延迟加载(lazy load)是(也成为懒加载)hibernate3关联关系对象默认的加载方式,延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作。可以简单理解为,只有在使用的时候,才会发出sql语句进行查询。 延迟加载的有效期是在session打开的情况下,当session关闭后,会报异常。当调用load方法加载对象时,返回代理对象,等到真正用到对象的内容时才发出sql语句。 hibernate2实现延迟加载有2种方式:1实体对象,2集合。 hibernate3中又引入了一种新的加载方式:3属性的延迟加载。 一般使用load的方法来实现延迟加载,在实现无限级联动使用延迟加载效率比较好。 ——百度百科(java,hibernate)

上面是java中对hibernate的延迟加载的描述,说的比我好多了。

记住三点:1,为了避免无谓的性能开销。2,需要时才真正加载数据。3,使用了代理。 

默认延迟加载

采用懒加载的方式根据客户id得到客户信息

[NHibernate]延迟加载
[NHibernate]延迟加载

 测试用代码,如图所示,此时数据已经加载出来了

[NHibernate]延迟加载

使用sql profile监控生成的sql语句,截图如下

[NHibernate]延迟加载

你会发现,此时只生成了查询customer的sql语句,nhibernate默认是使用延迟加载的,在前面的文章中,并没在映射文件中设置节点的lazy属性。

当展开customer的属性orders时或者调试向下移动的时候,会执行查询,你会看到如下的sql语句

[NHibernate]延迟加载
[NHibernate]延迟加载

延迟加载并关闭session

[NHibernate]延迟加载
[NHibernate]延迟加载

测试,当视图展开customer的orders属性,或者往下执行获得order集合时出错。

[NHibernate]延迟加载
[NHibernate]延迟加载

延迟加载,需要的时候再去加载,因为此时session已经关闭,没有去查询的通道了,结果是“此路不通”的提示。

这里采用多对多关系那篇文章中举的 order和product的例子。

[NHibernate]延迟加载
[NHibernate]延迟加载

进行测试,在查询的时候只有order表的数据(这个地方,有order数据的sql,猜测在一对多查询的时候,没有出现查询customer的sql语句,很有可能是因为缓存的问题造成,因为经常使用cusomer那条数据进行测试。)

[NHibernate]延迟加载

展开order的属性

[NHibernate]延迟加载

当展开order的属性,回去查询order下的所有的product,此时生成的sql如下:

[NHibernate]延迟加载
[NHibernate]延迟加载
[NHibernate]延迟加载

测试

[NHibernate]延迟加载

此时生成的sql语句

[NHibernate]延迟加载

如果此时展开products,同样会出现上面的异常

[NHibernate]延迟加载

通过上面的比较一对多和多对多的默认延迟加载和关闭session后的情况类似。

n+1次select查询问题

如果order下有很多个product,而我们就想需要的时候才去加载其中某些product的信息,如果采用立即加载的方式,势必产生多个sql语句,例如第一次查询得到所有的order对象,然后根据orderid去查询得到所有的产品。

测试,多对多延迟加载订单和订单下单价大于6666的产品

[NHibernate]延迟加载
[NHibernate]延迟加载

生成的sql语句

[NHibernate]延迟加载

延迟加载,可以解决select n+1的问题,比如你查询一个订单还有订单下的product,势必会产生多条sql语句,先是查询order的sql语句,然后是查询product的sql语句,就会频繁的查询数据库,造成性能方面的压力,而采用延迟加载,通过上面生成的sql语句你会发现,使用left out join 将关联的表拼接起来,只生成了一条sql。

本篇文章介绍了nhibernate在延迟加载方面的内容,nhibernate在使用过程中延迟加载方式是默认的。对延迟加载的定义,需要再慢慢的体会。

博客地址:

<a href="http://www.cnblogs.com/wolf-sun">http://www.cnblogs.com/wolf-sun/</a>

博客版权:

本文以学习、研究和分享为主,欢迎转载,但必须在文章页面明显位置给出原文连接。

如果文中有不妥或者错误的地方还望高手的你指出,以免误人子弟。如果觉得本文对你有所帮助不如【推荐】一下!如果你有更好的建议,不如留言一起讨论,共同进步!

再次感谢您耐心的读完本篇文章。

转载:http://www.cnblogs.com/wolf-sun/p/4077226.html