`
liyanboss
  • 浏览: 141788 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

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

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

那么,如何在一次dao查询以后,可以不关闭session,当继续执行,对象的get方法的时候,hibernate可以继续执行相应的查询,得到由于lazy而延迟加载的数据呢????
分享到:
评论
7 楼 占星 2015-07-20  
[b]
[flash=200,200][url][img][list]
[*]
引用
[u][u][u][u][u][i]457454[i][u][/u][/i][/i][/u][/u][/u][/u][/u]
[/list][/img][/url][/flash]
[/b]
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的生命周期变长。
5 楼 魔力猫咪 2008-01-23  
抛出异常的爱 写道
放在service层作这事
不要放在不同的service中去....
(前提你的spring用法正确,没有在dao里就把session关闭了.)

我说的也是这个意思。我们一般使用Spring是不会在Dao层做打开、关闭和事务控制的。你的事务配置放错地方了。
4 楼 抛出异常的爱 2008-01-23  
放在service层作这事
不要放在不同的service中去....
(前提你的spring用法正确,没有在dao里就把session关闭了.)
3 楼 liyanboss 2008-01-23  
引用
Spring给出的表现层延迟加载解决方案是OpenSessionInView过滤器。只要你配置了这个过滤器,就可以在页面渲染的时候获得延迟的对象。


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

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

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

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

相关推荐

    Hibernate延迟加载以及利用Spring

    ### Hibernate延迟加载以及利用Spring #### 一、Hibernate延迟加载概念与原理 在理解Hibernate的延迟加载机制之前,我们首先需要了解什么是延迟加载。延迟加载(Lazy Loading)是一种设计模式,其核心思想是在真正...

    hibernate延迟加载解决

    在Java开发中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者用面向对象的方式处理数据库操作。在大型项目中,由于数据量庞大,为了提高性能和减少数据库的负载,Hibernate引入了“延迟加载”...

    Spring延迟加载和声明式事务处理最终解决方案(修正版)

    Spring框架的延迟加载和声明式事务处理是两个关键特性,它们极大地简化了企业级应用的开发。延迟加载允许在需要时才加载关联的对象,而声明式事务处理则使得事务管理更加自动化,无需在代码中显式处理。 在Spring与...

    最新Struts和Hibernate和Spring经典面试题

    2. Hibernate 是如何延迟加载? Hibernate 的延迟加载可以通过实体对象、集合(Collection)和属性的延迟加载实现。当 Hibernate 在查询数据的时候,数据并没有存在与内存中,当程序真正对数据的操作时,对象才存在...

    Flex 与 Hibernate 的延迟加载问题

    在开发Flex与Hibernate集成的应用时,延迟加载(Lazy Loading)是一个常见的挑战,因为Flex客户端无法直接理解和处理Hibernate的延迟加载机制。延迟加载是一种优化策略,它允许关联的对象在真正需要时才被加载,而...

    Hibernate、Spring和Struts工作原理及使用理由

    Hibernate支持实体对象和集合的延迟加载,只有在实际需要时才会加载相关数据,节省内存,提高性能。 **类间关系**: Hibernate通过配置文件支持一对一、一对多、多对一和多对多的关系映射。 **缓存机制**: - **一...

    Hibernate延迟加载介绍.doc

    本文将深入探讨Hibernate中的延迟加载,包括实体对象、集合类型和属性的延迟加载。 一、实体对象的延迟加载 在Hibernate中,实体对象的延迟加载可以通过在映射文件中设置`lazy="true"`来启用。例如,对于名为`...

    hibernate和spring技术难点及其要点总结

    3. **延迟加载**:理解何时启用和避免“懒加载”引发的N+1查询问题。 综上所述,Hibernate和Spring的结合使用能大幅提升Java应用程序的开发效率,但同时也需要开发者对两者有深入的理解,以解决可能出现的性能和...

    Struts,Hibernate,Spring经典面试题收藏

    Hibernate提供了延迟加载功能,即在实际需要时才加载数据,以节省内存。它支持多种数据库,通过配置文件实现对象关系映射(ORM),简化了DAO层的编程。Hibernate的缓存机制包括一级缓存(内部缓存)和二级缓存,一级...

    Struts+Hibernate+Spring面试总结

    Hibernate的延迟加载机制允许只在需要时加载对象,这样可以减少内存消耗,提高性能。延迟加载分为实体对象和集合的延迟加载。例如,当查询数据时,实际的对象并不会立即加载到内存中,直到真正访问这些数据时,对象...

    SSH2 annotation 实现struts2.1.6 spring2.5.6 hibernate3.3 全注解开发

    综上所述,SSH2框架的全注解开发是一种高效、灵活的开发方式,它结合了Struts2的MVC处理、Spring的依赖管理和事务控制以及Hibernate的ORM和延迟加载机制,为Java Web应用提供了强大的支撑。通过学习和掌握这些知识点...

    spring+hibernate代码实例集

    3.2 Spring与Hibernate结合使用时,需要注意在事务边界内正确处理延迟加载。由于延迟加载依赖于Session,如果Session在事务结束后关闭,那么后续尝试访问延迟加载属性时会抛出异常。因此,需要确保在Service层的方法...

    struts_hibernate_spring集成

    - **OpenSessionInViewFilter**:此过滤器确保在视图渲染过程中保持一个打开的Hibernate Session,这对于事务管理和延迟加载特别有用。 #### 2. struts-config.xml的配置调整 在Struts配置文件中,为了与Spring...

    ssh集成jar包,支持spring集成Hibernate,spring集成struts2等

    - Hibernate支持延迟加载(Lazy Loading),提高性能,只在需要时加载数据。 - 使用SessionFactory和Session接口进行数据库会话管理,支持HQL(Hibernate Query Language)和SQL进行查询。 3. **Struts2框架**: ...

    ssh_inte2模板常用方法&延迟加载问题

    延迟加载(Lazy Loading)是Hibernate的一种优化策略,它允许我们在需要时才加载关联的对象,而不是在加载主对象时一次性加载所有关联数据。这种方式可以显著减少数据库查询次数,提高系统性能。然而,延迟加载也会...

    hibernate和spring笔记

    2. **延迟加载(Lazy Loading)**: 只有在真正需要数据时才从数据库加载,提高性能。 3. **HQL(Hibernate Query Language)**: 类似SQL的查询语言,可以方便地进行对象查询。 4. **Criteria API**: 提供了构建动态...

    Struts,Hibernate,Spring经典面试题.doc

    4. **延迟加载**:Hibernate支持对象和集合的延迟加载,只有在真正需要数据时才从数据库加载,提升性能。 5. **关系映射**:通过配置文件实现类间关系,如一对一、一对多、多对多等。 Hibernate的优势在于自动处理...

    Spring2.5+Hibernate3.2开发手册

    3. **实体生命周期管理**:支持了预加载(pre-fetching)和延迟加载(lazy-loading),以及更灵活的实体状态管理,比如“脱管”(detached)状态。 4. **更丰富的类型支持**:包括对数组、集合和自定义类型的支持,...

    Struts+Hibernate+Spring的整合方法

    8. **处理Hibernate延迟加载**:使用`OpenSessionInViewFilter`过滤器,确保Session在整个HTTP请求期间保持打开状态,解决懒加载问题。配置过滤器映射到所有.do请求。 9. **处理只读模式异常**:由于...

Global site tag (gtag.js) - Google Analytics