读书人

hibernate结合spring怎么办对象的延迟

发布时间: 2012-11-16 14:12:14 作者: rapoo

hibernate结合spring怎么处理对象的延迟加载?
在hibernate3中所有从数据库查询出来的数据,都是默认lazy的,这样一次dao查询就只能够拿到这个domain对象自己的基本属性,对于它的其他关联(many2one,one2many,list,set)等采用默认的设置是会lazy的,所以通过这个对象去get其他属性对象的话,就会是nullPointException,因为这个时候,hibernate的session已经关闭了,同时hibernate的异常也是session has closed。

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

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

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

有没有什么方法可以解决的呀???????? 4 楼 抛出异常的爱 2008-01-23 放在service层作这事
不要放在不同的service中去....
(前提你的spring用法正确,没有在dao里就把session关闭了.) 5 楼 魔力猫咪 2008-01-23 抛出异常的爱 写道放在service层作这事
不要放在不同的service中去....
(前提你的spring用法正确,没有在dao里就把session关闭了.)
我说的也是这个意思。我们一般使用Spring是不会在Dao层做打开、关闭和事务控制的。你的事务配置放错地方了。 6 楼 shaqiang32 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的生命周期变长。

读书人网 >软件架构设计

热点推荐