NHibernate延迟加载机制

NHibernate实现延迟加载的主要结构:

BuildSessionFactory的时候:

1. 根据proxyfactory.factory_class的配置创建IProxyFactoryFactory对象

2. 如果use_proxy_validator配置为true(默认为true),加载实体映射元数据之后,对需要代理的 实体使用 IProxyFactoryFactory的ProxyValidator进行验证(例如要求实体有默认构造器、方法属性必 须为virtual类型等)

3. 为需要代理的实体类型创建IProxyFactory,并调用IProxyFactory对象的PostInstantiate方法

对每一个需要代理的实体类型都会创建一个IProxyFactory对象并缓存,创建代理对象则通过 IProxyFactory的GetProxy方法完成

AbstractProxyFactory主要是实现PostInstantiate方法,这个方法主要是将创建代理对象所需的信息 记录下来,例如 EntityName(字符串的实体类名)、PersistentClass(代理对象的System.Type)、 Interfaces(代理对象需要额外实现的接口,例如INHibernateProxy),其他几个记录的属性则为单主键 和组合主键id的get、set方法

ProxyFactory则主要实现GetProxy方法,使用Castle或者LinFu等动态代理库以及上述信息创建代理对 象

时间: 2024-12-03 01:33:53

NHibernate延迟加载机制的相关文章

NHibernate之旅(12):初探延迟加载机制

节内容 引入 延迟加载 实例分析 1.一对多关系实例 2.多对多关系实例 结语 引入 通过前面文章的分析,我们知道了如何使用NHibernate,比如CRUD操作.事务.一对多.多对多映射等问题,这篇我们初步探索NHibernate中的加载机制. 在讨论之前,我们看看我们使用的数据模型,回顾一下第二篇建立的数据模型. Customer与Orders是一对多关系,Order与Product是多对多关系.这一篇还是使用这个模型,有关具体配置和映射参考本系列的文章. 延迟加载(Lazy Loading

[NHibernate]延迟加载

目录 写在前面 文档与系列文章 延迟加载 一个例子 总结 写在前面 上篇文章介绍了多对多关系的关联查询的sql,HQL,Criteria查询的三种方式.本篇文章将介绍nhibernate中的延迟加载方式,延迟加载按个人理解也可以叫做按需要加载(Loading-on-demand). 文档与系列文章 [Nhibernate]体系结构 [NHibernate]ISessionFactory配置 [NHibernate]持久化类(Persistent Classes) [NHibernate]O/R

NHibernate学习专题

我的NHibernate之路(3)---表间多对多配置篇 我的NHibernate之路(2)---主从表(一对多)配置篇 我的NHibernate之路(1)---基本配置篇 NHibernate之旅(24):探索NHibernate二级缓存(下) NHibernate之旅(23):探索NHibernate二级缓存(上) NHibernate之旅(22):探索NHibernate一级缓存 NHibernate之旅(21):探索对象状态 NHibernate之旅(20):再探SchemaExport

[NHibernate]存储过程的使用(二)

目录 写在前面 文档与系列文章 创建对象 更新对象 总结 写在前面 上篇文章介绍了如何使用MyGeneration代码生成器生成存储过程,以及nhibernate中通过存储过程删除数据的内容,这篇文章将介绍如何创建对象,更新对象. 文档与系列文章 [Nhibernate]体系结构 [NHibernate]ISessionFactory配置 [NHibernate]持久化类(Persistent Classes) [NHibernate]O/R Mapping基础 [NHibernate]集合类(

NHibernate之旅(22):探索NHibernate一级缓存

本节内容 引入 NHibernate一级缓存介绍 NHibernate一级缓存管理 结语 引入 大家看看上一篇了吗?对象状态.这很容易延伸到NHibernate的缓存.在项目中我们灵活的使用NHibernate的缓存机制.NHibernate性能会大大提高的哦,我们接下来就来探索NHibernate缓存机制吧,这篇我没有准备什么,先来学习下NHibernate一级缓存. NHibernate一级缓存介绍 NHibernate一级缓存即ISession缓存,ISession缓存属于事务级缓存,是N

延迟加载(Lazy Loading)3

问题描述 Hibernate.initialize方法可以通过强制加载关联对象实现这一功能:Hibernate.initialize(user.getAddresses());session.close();//通过Hibernate.initialize方法强制读取数据//addresses对象即可脱离session进行操作Sethset=user.getAddresses();TAddressaddr=(TAddress)hset.toArray()[0];System.out.printl

[NHibernate]N+1 Select查询问题分析

目录 写在前面 文档与系列文章 N+1 Select查询问题分析 总结 写在前面 在前面的文章(延迟加载,立即加载)中都提到了N+1 Select的问题,总觉得理解的很不到位,也请大家原谅,这也是为什么单独将该问题拿出来做分析的原因.nhibernate的默认Lazy加载方式是解决N+1 select问题的一种方案,而我自身的理解是立即加载可以解决,完全的背道而驰了.写出那篇文章后,对这个问题,一直念念不忘,总觉得哪地方不对劲.由于我对问题的理解很不透彻,也同样造成你的误解,真的很抱歉. 文档与

[NHibernate]存储过程的使用(三)

目录 写在前面 文档与系列文章 查询 总结 写在前面 前面的文章介绍了在nhibernate中使用存储过程进行增删改的操作,当然查询也是可以的,在nhibernate中也可以执行任意的存储过程.本篇文章将介绍如何使用查询的存储过程的方式. 文档与系列文章 [Nhibernate]体系结构 [NHibernate]ISessionFactory配置 [NHibernate]持久化类(Persistent Classes) [NHibernate]O/R Mapping基础 [NHibernate]

[Nhibernate]对象状态

目录 写在前面 文档与系列文章 对象状态 瞬时态(Transient) 持久态(Persistent) 托管态(Detached) 对象状态转换 总结 写在前面 前面两篇文章介绍了SchemaExport工具的使用,使用该工具可以根据映射文件生成数据库架构,这篇文章将介绍nhibernate中的三种对象状态. 在程序运行过程中,使用对象的方式操作数据库的同时,必然会产生一系列的持久化对象.这些对象可能是刚刚创建并准备进行存储的,也有可能是从数据库进行查询得到的,为了区别这些对象,根据对象和当前S