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

来源:互联网 发布:淘宝新店没销量怎么办 编辑:程序博客网 时间:2024/04/29 12:00

看教程的时候不是特别很明白所谓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就充当了代理的角色(个人理解)

原创粉丝点击