论坛首页 入门技术论坛

hibernate结合spring怎么处理对象的延迟加载?

浏览 3268 次
该帖已经被评为新手帖
作者 正文
   发表时间:2008-01-23  
在hibernate3中所有从数据库查询出来的数据,都是默认lazy的,这样一次dao查询就只能够拿到这个domain对象自己的基本属性,对于它的其他关联(many2one,one2many,list,set)等采用默认的设置是会lazy的,所以通过这个对象去get其他属性对象的话,就会是nullPointException,因为这个时候,hibernate的session已经关闭了,同时hibernate的异常也是session has closed。

那么,如何在一次dao查询以后,可以不关闭session,当继续执行,对象的get方法的时候,hibernate可以继续执行相应的查询,得到由于lazy而延迟加载的数据呢????
   发表时间:2008-01-23  
首先你要确认,在Service层是不存在这种问题的。因为是在进入Service层的时候Session打开,事务开始。离开的时候提交事务,Session关闭。如果你这里出异常,那就是你错误把事务配置到Dao里头了。
Spring给出的表现层延迟加载解决方案是OpenSessionInView过滤器。只要你配置了这个过滤器,就可以在页面渲染的时候获得延迟的对象。
还有,下次这种简单查书就可以知道的问题最好发到新手那里。这里发太浅显的问题会被扣分的。
1 请登录后投票
   发表时间:2008-01-23  
魔力猫咪 写道
首先你要确认,在Service层是不存在这种问题的。因为是在进入Service层的时候Session打开,事务开始。离开的时候提交事务,Session关闭。如果你这里出异常,那就是你错误把事务配置到Dao里头了。
Spring给出的表现层延迟加载解决方案是OpenSessionInView过滤器。只要你配置了这个过滤器,就可以在页面渲染的时候获得延迟的对象。
还有,下次这种简单查书就可以知道的问题最好发到新手那里。这里发太浅显的问题会被扣分的。

为什么大家用open in view就是由于楼主的问题
1 请登录后投票
   发表时间:2008-01-23  
引用
Spring给出的表现层延迟加载解决方案是OpenSessionInView过滤器。只要你配置了这个过滤器,就可以在页面渲染的时候获得延迟的对象。


在页面显示我知道用OpenSessionInViewFilter,但是问题是我不是要拿到这些数据去填充表现层,而是我要另外的起一个线程去处理一些数据。

比如说我先查询到所有论坛的发帖,可能是一个List,(这是通过一个DAO查到的)。然后判断每一个帖子的回帖超过10个,就给这个帖子的owner加1分,但是当我再通过这个帖子getOwner的时候,就会报错,说session has closed.

有没有什么方法可以解决的呀????????
0 请登录后投票
   发表时间:2008-01-23  
放在service层作这事
不要放在不同的service中去....
(前提你的spring用法正确,没有在dao里就把session关闭了.)
0 请登录后投票
   发表时间:2008-01-23  
抛出异常的爱 写道
放在service层作这事
不要放在不同的service中去....
(前提你的spring用法正确,没有在dao里就把session关闭了.)

我说的也是这个意思。我们一般使用Spring是不会在Dao层做打开、关闭和事务控制的。你的事务配置放错地方了。
0 请登录后投票
   发表时间:2008-09-28  
抛出异常的爱 写道

魔力猫咪 写道
首先你要确认,在Service层是不存在这种问题的。因为是在进入Service层的时候Session打开,事务开始。离开的时候提交事务,Session关闭。如果你这里出异常,那就是你错误把事务配置到Dao里头了。 Spring给出的表现层延迟加载解决方案是OpenSessionInView过滤器。只要你配置了这个过滤器,就可以在页面渲染的时候获得延迟的对象。 还有,下次这种简单查书就可以知道的问题最好发到新手那里。这里发太浅显的问题会被扣分的。为什么大家用open in view就是由于楼主的问题


OpenSessionInViewFilter是Spring提供的一个针对Hibernate的一个支持类,其主要意思是在发起一个页面请求时打开Hibernate的Session,一直保持这个Session,直到这个请求结束,具体是通过一个Filter来实现的。

由于Hibernate引入了Lazy Load特性,使得脱离Hibernate的Session周期的对象如果再想通过getter方法取到其关联对象的值,Hibernate会抛出一个LazyLoad的Exception。所以为了解决这个问题,Spring引入了这个Filter,使得Hibernate的Session的生命周期变长。
1 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics