NHibernate中对同一个对象的Lazyload要设置一致

简介:

在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或者减少对对象的引用。

目录
相关文章
|
3月前
|
存储 JSON JavaScript
组件的创建,引用,样式隔离以及methods,data,properties和数据事件监听
详细介绍了微信小程序中组件的创建、引用(包括局部引用和全局引用)、样式隔离、组件的data、methods和properties,以及组件的数据监听器的使用方法和场景。
组件的创建,引用,样式隔离以及methods,data,properties和数据事件监听
|
4月前
|
Java 数据库连接 数据库
|
存储 JavaScript
如何使用 ref 属性获取子组件实例对象?
如何使用 ref 属性获取子组件实例对象?
148 0
lodash遍历并继承对象属性,自定义分配
lodash遍历并继承对象属性,自定义分配
140 0
lodash创建一个新的对象,对象的属性名可以修改
lodash创建一个新的对象,对象的属性名可以修改
480 0
lodash创建一个从对象中选择的属性的对象
lodash创建一个从对象中选择的属性的对象
81 0
lodash移除对象属性路径的属性
lodash移除对象属性路径的属性
136 0
|
JavaScript 前端开发 开发者
BOM(一)概述、history对象、location对象、navigator对象、事件
BOM(一)概述、history对象、location对象、navigator对象、事件
225 0
BOM(一)概述、history对象、location对象、navigator对象、事件
|
存储 JavaScript 前端开发
访问对象的属性,你知道有哪些方法?
相信对象对于每个使用JavaScript的人来说都不陌生。访问对象的属性几乎日常开发每天都在用。下面我们一起探索下有哪些方式可以实现属性的访问。
201 0
|
C# .NET 开发框架
WPF笔记 ( xmlns引用,Resource、Binding 前/后台加载,重新绑定) 2013.6.7更新
原文:WPF笔记 ( xmlns引用,Resource、Binding 前/后台加载,重新绑定) 2013.6.7更新 1、xmlns Mapping URI的格式是 clr-namespace:[;assembly=] (1)如果自定义类和XAML处在同一个Assembly之中,只还需要提供clr-namespace值。
1453 0