NHibernate中对同一个对象的Lazyload要设置一致
来源:互联网 发布:python 求第n个质数 编辑:程序博客网 时间:2024/05/18 18:20
在NHibernate中出于性能的考虑,经常使用Lazyload的方式来加载关联的对象,关于什么是Lazyload,以及怎么使用,可以参见博客园中的文章,比如:http://www.cnblogs.com/lyj/archive/2008/10/28/1321494.html
常用NHibernate.ByteCode.Castle动态代理来实现Lazyload,使用该程序集会在运行时创建实体对应的代理类,如果实体使用了继承关系,并通过NHibernate来映射,那么动态代理类在类型转换时会有问题。
比如在C#中定义了一个Node类,然后有个State类继承自Node类,然后有Flow.Node引用了这个类,同时我还在Task.Node中引用了这个类。并且在默认情况下启用了Lazyload。在通过Flow对象获得Node对象时,会返回'Castle.Proxies.NodeProxy'对象,而这个对象是没办法转换成State对象的,所以会抛出如下的异常:
Unable to cast object of type 'Castle.Proxies.NodeProxy' to type 'Xxx.Core.Model.Definition.State'.
那么怎么办呢,只有不使用Lazyload,所以我将Flow.Node的加载方式改为立即加载,然后这个异常就没有了。但是今天在调用另外的方法,然后在调用Flow.Node时,又出现了这个异常,这让我十分郁闷,我明明指定了Flow.Node是立即加载的,那么怎么还是会被系统转换为NodeProxy了呢?
经过研究发现,应该是Task.Node没有被设置为立即加载的原因。我在调用Flow.Node之前,调用了Task对象,所以NHibernate根据Task的Mapping设置,将Node设置为动态代理类,同时将Node缓存到了Session中,然后再调用Flow.Node时,系统就会先从缓存中查找是否有对应的Node对象,结果正好有NodeProxy的缓存,所以就直接返回NodeProxy给Flow.Node了,系统根本没有检查Flow.Node是不是立即加载还是懒加载。
所以要解决这个异常的话,有两个办法,一种是将Task.Node也设置成为立即加载,那么就不会有NodeProxy对象在缓存中。另外一种办法就是不在Task中引用Node对象,我采用的是第二种方法,在Task中,其实我只需要Task.NodeId就够了,不需要再加载Node对象进来。
总的来说,如果在NHibernate中用到了继承类,如果同时用到了Lazyload,那么在转换类型时就可能抛出异常。解决办法就是将Lazyload取消,改为立即加载。如果有多个实体引用了该对象,那么就需要将这个对象的引用的Lazyload方式设置为一致的,对不使用Lazyload或者减少对对象的引用。
- NHibernate中对同一个对象的Lazyload要设置一致
- Android中对同一个TextView设置不同字体样式
- html中lazyload的实现。
- 对同一个TextView设置不同的颜色、字体
- 对同一个标签奇偶行设置不同的样式
- retain 引用计数:两个所有者对同一个对象的管理
- Eclipse中设置与项目一致的java版本
- NHibernate中多主键时的对象标示方法
- 如何设置nhibernate多对多关系
- Makefile中对同一个目标的多次定义
- 在同一个TextView中设置不同的字体风格
- iOS 中为同一个label设置不同的颜色
- iOS同一个label中设置不同的字体及颜色
- 怎样获取一个集合中不同对象的同一个属性?
- Android中动态设置布局高度一致
- JAVA中如何取出两个不同List对象(对象一致)中所有不同的对象的集合
- 关于对lazyload的原理进行的学习
- Oracle 中比对2 张表之间数据是否一致的几种方法
- 使用C#通过Oracle.DataAccess连接Oracle,部署时需要注意版本问题
- 动态Linq的逻辑与和逻辑或的条件查询
- Oracle数据库需要修改默认的Profiles,避免用户密码过期
- 苹果开发者帐号申请流程-个人版
- 在企业应用开发中遵循开源协议
- NHibernate中对同一个对象的Lazyload要设置一致
- 如何将数据库从SQL Server迁移到MySQL
- 深蓝词库转换1.5发布
- 对象的继承关系在数据库中的实现方式和PowerDesigner设计
- jboss5.x与jdk1.6冲突问题的解决方案
- 使用SharpZipLib压缩打包多个内存中的文件
- Android --- App列表之分组ListView
- 网上买火车票网站的Bug,实在是留给程序员的福利
- VisualNet信息管理