对于NHibernate中延迟加载个人的一些理解
2011-03-05 18:50
399 查看
看教程的时候不是特别很明白所谓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就充当了代理的角色(个人理解)
比如一个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就充当了代理的角色(个人理解)
相关文章推荐
- 延迟加载的个人理解
- 个人对于补码的一些理解
- 对于Java转型的一些个人理解
- 对于AOP切面编程的一些个人理解
- Recyclerview的一些个人理解与使用(六)Recyclerview的分段加载
- 对于CN Payroll我的一些个人理解
- 个人对于OO的一些理解
- 对于angular 中MVC 和 MVVM 的一些个人理解
- 个人对于OO的一些理解
- 个人对于套接字的一些理解!
- 对于this和$(this)的个人理解
- 关于线程方法的一些个人理解
- 黑马程序员——个人对JAVA反射的一些理解
- 个人对于三层架构解决项目问题的理解
- IOS对于线程队列的一些理解
- 对于文件加载完成的一些心得
- 个人对于归档的初级理解
- 关于onMeasure ()和onLayout()的一些个人理解
- 实践中对于闭包的一些理解
- Recyclerview的一些个人理解与使用(三)列表中的计时器