一、延迟加载

  延迟加载可以理解为:当需要用的时候才加载。

  假设我们数据库有一个Person对象,一个Country对象,其中Person属于Country,一对多关系。当我们Get()一个 Person对象的时候。并不立即把Country对象也加入来,而是当我们的代码执行到要通过Person调用Country对象的时 候,NHibernate才到数据库去查询对应的Country对象,这就叫延迟加载。相反,如果我们Get()一个Person对象,并且连与此 Person对象相关联的Country对象也一起加载到程序中,这就叫立即加载。

  延迟加载必须在Session的周期内,如果查询了数据,但是程序中又并没有用到的时候,Session又关闭了。这时NHibernate就不能为我们实现延迟加载。

  一对多示例:

  Person - Country是一对多关系。

        static void Main(string[] args)
{
ISessionFactory SessionFactory = (new Configuration()).Configure().BuildSessionFactory(); ;
ISession session = SessionFactory.OpenSession(); PersonModel p = session.Get<PersonModel>(1);
Console.WriteLine(p.Name);
Thread.Sleep(5000);
Console.WriteLine(p.Country.CountryName); Console.ReadKey();
}

  来看以上代码执行结果:

  

  以上程序执行的过程是,当我们查询Person时,NHibernate加载出Person对象。但是与其对应的Country对象并不从数据 库查出。而当我们需要用到Country对象的内容时,NHibernate此时才再次发出一条SQL语句执行,获得对应的Country对象。

  禁用延迟加载:

  假如我们在Country.hbm.xml映射文件里面设置非延迟加载呢?

  <class lazy="false" name="Model.CountryModel, Model" table="Country">

  我们在来看看执行结果:

  

  这次只需看到上面的SQL语句有个inner join就够了。当我们禁止延迟加载之后,NHibernate一次过从数据库就加载出了与Person对应的Country对象。而且,在5秒钟之后,也并没有再执行SQL语句,因为一早就已经获取到了Country对象。

  关闭Session:

  首先,记得先把lazy="false"改回true;

  Program.cs

        static void Main(string[] args)
{
ISessionFactory SessionFactory = (new Configuration()).Configure().BuildSessionFactory(); PersonModel p = new PersonModel();
using (ISession session = SessionFactory.OpenSession())
{
p = session.Get<PersonModel>(1);
Console.WriteLine(p.Name);
}
Console.WriteLine(p.Country.CountryName); Console.ReadKey();

  然后当执行到需要Country对象的时候,程序报错。

  

  由此,我们得到,当Session关闭之后,就没有办法再延迟加载数据了。一定要注意。

  另外,多对多关系中,有一点需要注意,就是延迟加载的时候,加载多少个才合适呢?这个NHibernate真不知道。对于这种情况,最后就是自己程序控制。

二、立即加载

  立即加载的第一种方法,通过上面的例子。设置lazy="false"就能够做到。另外,也能够通过编程的方式,强制使用立即加载。

  NHibernateUtil.Initialize

  program.cs

        static void Main(string[] args)
{
ISessionFactory SessionFactory = (new Configuration()).Configure().BuildSessionFactory(); PersonModel p = new PersonModel();
using (ISession session = SessionFactory.OpenSession())
{
p = session.Get<PersonModel>(1);
NHibernateUtil.Initialize(p.Country);
}
Console.WriteLine(p.Country.CountryName); Console.ReadKey();
}

  以上代码,正常输出:

  

  这里,需要ISession也关闭了,但是却能直接执行,因为Country的数据,一早已经加载到程序中,不再需要ISession。

  抓取策略

  另外,通过抓取策略,也能够强制使用立即加载机制。

  这次我们倒过来,我们从Country查Person。

  我们把Country.hbm.xml修改为如下:

    <!-- 一个Country里面有多个Person -->
<set name="ListPerson" table="Person" generic="true" inverse="true" fetch="join">
<key column="CountryId" foreign-key="FK_Person_Country"/>
<one-to-many class="Model.PersonModel,Model"/>
</set>

  Program.cs

        static void Main(string[] args)
{
ISessionFactory SessionFactory = (new Configuration()).Configure().BuildSessionFactory(); CountryModel c = new CountryModel();
using (ISession session = SessionFactory.OpenSession())
{
c = session.Get<CountryModel>(1);
}
foreach (PersonModel p in c.ListPerson)
{
Console.WriteLine(p.Name);
} Console.ReadKey();
}

  以上代码,在关闭ISession之后,再查找Country下的Person输出结果如下:

  

  如果去掉fetch="join",一样报ISession已关闭错误。

  关于延迟加载与立即加载,就了解这么多。以后如果还有用到更深入的再补充。

NHibernate 延迟加载与立即加载 (第七篇)的更多相关文章

  1. NHibernate教程(13)--立即加载

    本节内容 引入 立即加载 实例分析 1.一对多关系实例 2.多对多关系实例 结语 引入 通过上一篇的介绍,我们知道了NHibernate中默认的加载机制--延迟加载.其本质就是使用GoF23中代理模式 ...

  2. ASP.NET MVC深入浅出(被替换) 第一节: 结合EF的本地缓存属性来介绍【EF增删改操作】的几种形式 第三节: EF调用普通SQL语句的两类封装(ExecuteSqlCommand和SqlQuery ) 第四节: EF调用存储过程的通用写法和DBFirst模式子类调用的特有写法 第六节: EF高级属性(二) 之延迟加载、立即加载、显示加载(含导航属性) 第十节: EF的三种追踪

    ASP.NET MVC深入浅出(被替换)   一. 谈情怀-ASP.NET体系 从事.Net开发以来,最先接触的Web开发框架是Asp.Net WebForm,该框架高度封装,为了隐藏Http的无状态 ...

  3. Hibernate之加载策略(延迟加载与即时加载)和抓取策略(fetch)

    假设现在有Book和Category两张表,表的关系为双向的一对多,表结构如下: 假设现在我想查询id为2的那本书的书名,使用session.get(...)方法: Session session=H ...

  4. EF如何操作内存中的数据以及加载相关联表的数据:延迟加载、贪婪加载、显示加载

    之前的EF Code First系列讲了那么多如何配置实体和数据库表的关系,显然配置只是辅助,使用EF操作数据库才是每天开发中都需要用的,这个系列讲讲如何使用EF操作数据库.老版本的EF主要是通过Ob ...

  5. EF 延迟加载和预先加载

    最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精   本节探讨延迟加载和预先加载 Entity Frame ...

  6. Entity Framework关联查询以及数据加载(延迟加载,预加载)

    数据加载分为延迟加载和预加载 EF的关联实体加载有三种方式:Lazy Loading,Eager Loading,Explicit Loading,其中Lazy Loading和Explicit Lo ...

  7. EF如何操作内存中的数据和加载外键数据:延迟加载、贪婪加载、显示加载

    EF如何操作内存中的数据和加载外键数据:延迟加载.贪婪加载.显示加载 之前的EF Code First系列讲了那么多如何配置实体和数据库表的关系,显然配置只是辅助,使用EF操作数据库才是每天开发中都需 ...

  8. 第六节: EF高级属性(二) 之延迟加载、立即加载、显示加载(含导航属性)

    一. 简介 上一个章节中,也介绍了立即加载和延迟加载,但上一个章节是针对单表而言的,不含外键,立即也好,延迟也好,都是指单表中的数据.但本章节重点介绍的三种加载方式均是针对含(导航属性.外键)的情况下 ...

  9. Mybatis的延迟加载和立即加载

    Mybatis的延迟加载和立即加载 示例:在一对多中,当我们有一个用户,他有100个帐户 问题1:在查询用户时,要不要把关联的账户查出来? 问题2:在查询账户时,要不要把关联的用户信息查出来? 问题1 ...

随机推荐

  1. Xamarin.Android真机测试提示[INSTALL_FAILED_UPDATE_INCOMPATIBLE]

    Xamarin.Android真机测试提示[INSTALL_FAILED_UPDATE_INCOMPATIBLE]   使用真机测试的时候,出现以下错误提示:   Deployment failed ...

  2. [POI2014]Tourism

    题目大意: 给定一个$n(n\le20000)$条个点,$m(m\le25000)$条边的无向图,保证图中最长路径上的点数不超过$10$.对一个点染色的代价是$w_i$.求使得每个结点都被染色或至少有 ...

  3. Web性能压力测试工具之WebBench详解

    PS:在运维工作中,压力测试是一项很重要的工作.比如在一个网站上线之前,能承受多大访问量.在大访问量情况下性能怎样,这些数据指标好坏将会直接影响用户体验.但是,在压力测试中存在一个共性,那就是压力测试 ...

  4. kubernetes API Server安全

    用户访问API Server(以下简称Server),K8S的安全检查步骤:认证和授权. 认证解决用户是谁的问题,就是验证用户名密码;授权解决用户能做什么的问题,就是检查该用户是否拥有权限访问请求的资 ...

  5. Architecting Android…The clean way?

    Architecting Android-The clean way? 原文链接:http://fernandocejas.com/2014/09/03/architecting-android-th ...

  6. net.sf.json.JSONException: There is a cycle in the hierarchy!错误解决方案

    net.sf.json.JSONException: There is a cycle in the hierarchy!错误解决方案 今天在用List集合转换成json数组的时候发生了这个错误,这个 ...

  7. UserAgent伪装浏览器

    经常逛论坛的朋友经常会遇到这样的问题:论坛个性签名里的JS代码把个人浏览器信息等被人一览无余,我并不想他们得到我的这类信息. 咋办?很简单的办法就是伪装,怎么伪装?对于chrome.firefox等这 ...

  8. pip install 报错UnicodeDecodeError: 'ascii' codec can't decode byte

    2017-03-23 报错原因: pip安装Python包会加载我的用户目录,我的用户目录恰好是中文的,ascii不能编码. 解决办法: python目录 Python27\Lib\site-pack ...

  9. How does a single thread handle asynchronous code in JavaScript?

    原文:https://www.quora.com/How-does-a-single-thread-handle-asynchronous-code-in-JavaScript ----------- ...

  10. 一步一步学习Unity3d学习笔记系1.3 英雄联盟服务器集群架构猜想

    说到了网游那就涉及到服务器了,时下最火的属英雄联盟了,我也是它的粉丝,每周必撸一把,都说小撸怡情,大撸伤身,强撸灰飞烟灭,也告诫一下同仁们,注意身体,那么他的服务器架构是什么呢,给大家分享一下, 具体 ...