对于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就充当了代理的角色(个人理解)
- 对于NHibernate中延迟加载个人的一些理解
- 延迟加载的个人理解
- NHibernate中一对一关联的延迟加载
- 对于angular 中MVC 和 MVVM 的一些个人理解
- Java中对于延迟加载的探讨
- 个人对于OO的一些理解
- 个人对于套接字的一些理解!
- 对于Java转型的一些个人理解
- Python中对于yield的个人理解
- 延迟加载的理解
- 对于CN Payroll我的一些个人理解
- 对于产品中“赞”的一些理解
- 对于dequeueReusableCellWithIdentifier:的个人理解
- 对于dequeueReusableCellWithIdentifier:的个人理解
- 对于dequeueReusableCellWithIdentifier:的个人理解
- 个人对于SDN的理解
- 个人对于lower_bound的理解
- 对于bootstrap的个人理解
- CMD命令大全
- poj 1321
- WINDOWS下PCI接口卡WDM驱动程序的DMA编程技术
- 3D demo
- 如何实现根据元素的id后面的编号进行样式的变化
- 对于NHibernate中延迟加载个人的一些理解
- PCI总线特性及信号说明
- 数据库优化(转 )
- Debian中设置sudo
- PBRT学习笔记:在单位圆内部均匀采样
- PCI 扩展 ROM
- 在Datagridview控件利用下拉菜单进行枚举数据输入
- C++学习-构造函数
- 基于PCI总线的中断机制研究