对于NHibernate中延迟加载个人的一些理解

看教程的时候不是特别很明白所谓NHibernate的延迟加载到底是个什么东西 为什么需要默认延迟加载还不是立即加载 为什么延迟加载和代理模式有关 仔细研究后发现 所谓延迟加载 就是当某个实体类包含另一个实体类 并且是一对多或者多对多的时候 只加载其本身 而不加载其包含的那个对象所映射的数据

比如一个Customer对象 包含一个Order对象 如下

public class Customer

{

      public virtual int id{get;set;}

      public IList<Order> orders{get;set}

}

public class Order

{

      public virtual int id{get; set;}

      public virtual Customer customer{get;set;}

}

当在在某个方法中查询某个Customer的时候 使用using强制关闭ISession

public Customer GetCustomer(int id)

{

     using(ISession session=new SessionMangerment().GetSession())

     {

          return session.Get<Customer>(id);

     }

}

这个时候其实返回的Customer中orders并没有被初始化 也就是说 如果我们调用某个方法查询此Customer中的orders 那么其实还需要NHibernate做一次查询 但是 由于我们在GetCustomer()方法中关闭了session 所以此时无法进一步查询 故会抛出HibernateException异常

 

这里又突然想到一点 就是当我再次通过Customer查询其包含的orders中的内容的时候 NHibernate又是怎么知道我已经把这个session给dispose掉了呢?个人的理解 和.net中一样 每一个session都有个固定的ID 然后NHibernate可能会维护某个HASHTABLE之类的东西 形成一个键值对 将session和由他创建的对象一一关联起来 当然 这仅仅是我个人的猜测

 

这样就不难理解NHibernate为什么要将延迟加载默认开启了 因为如上面的例子 其实我们每次将数据库中的数据映射为Customer实体的时候 并不需要把与之对应的Order也映射成实体类 毕竟不是每次都需要这些数据 NHibernate就使用延迟加载来达到这个目的 而其中的session就充当了代理的角色(个人理解)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值