`
ykyfendou
  • 浏览: 408042 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

hibernate的OpenSessionInView--MVC模式下hibernate关联查询还未使用数据session就关闭了导致关联查询报错的问题

阅读更多

 

在开发中,我们使用hibernate进行数据的查询,当我们使用关联查询的时候,我们希望查询这个对象及这个对象包含的所有子对象,同时显示在页面中,但是当我们在页面使用的时候,会提示我们session已经关闭的异常。

 

 

在单向关联的父子对象中,如果我们需要在查询的时候,也把子对象查询出来,那么,可以设置  lazy=false

 

因为在hibernate3中,lazy的默认值是true的。如果我们不关闭懒加载,那么这个懒加载就是启用的。

 

而我们进行关联查询的时候,如果页面对一个action进行请求,那么我们进行查询:

 

 

String sql="from Article where periodicalId='"+ periodicalId+"' order by periodicalId desc,  articleDate desc ";

 

其中 Article中有一个子对象Periodical

 

我们希望的是,在查询Article的时候,把他的periodical对象也查询得到。

 

       Session session=this.getHibernateTemplate().getSessionFactory().openSession();

       List queryArticleList=session.createQuery(sql).list();

  

如果代码仅仅这样写,我们是可以查询article的子对象的。

 

但是别忘了,我们的session还没有关闭,我们需要加上:

 

 

session.close();

 

我们可以通过使用:session.isOpen() 方法来查看session是否关闭。

 

    public List queryArticleByCondition(String sql) {

       Session session=this.getHibernateTemplate().getSessionFactory().openSession();

       System.out.println("session: "+session.isOpen()+"   : ");

       List queryArticleList=session.createQuery(sql).list();

       session.close();

       System.out.println("session: "+session.isOpen()+"   : ");

       return queryArticleList;

    }

 

 

 

 

 

这样的话,如果我们在没有设置lazy的时候,就无法查询到子对象了。

 

因为此时lazytrue,也就是我们启动了懒加载,何为懒加载,懒加载就是当你需要子对象的时候,我再去进行查询,如果你不需要,我就不会去查询你的子对象的。

 

我们此时的lazytrue,那么就是说,在查询Article的时候,我只发出了一条查询,然后就把结果集List返回到service,到action,到前台页面中了,那么此时我们的页面中还需要这个Article这个对象的子对象的,所以,就会去进行加载了,就去再次进行查询这个对象的子对象,但是此时就有问题了,我们的session在我们查询完Article的时候就已经关闭了,session都已经关闭了,怎么可能会查询得到呢。所以就无法查询到子对象信息了。

 

 

 

为了解决这个问题。我们可以把lazy手动的设置为false

 

<many-to-one name="periodical" class="com.slfd.hydroElectric.entity.Periodical" column="periodicalId" not-null="true" lazy="false"/>

  

 

这样在查询article的时候,就会直接把父对象的子对象都直接查询出来,放在返回的结果集中,然后我们就可以直接使用了。

 

 

当然,我们也可以在获得session的时候,不重新打开session,而是使用当前的session

 

 

    public List queryArticleByCondition(String sql) {

       Session session=this.getHibernateTemplate().getSessionFactory().getCurrentSession();

       System.out.println("session: "+session.isOpen()+"   : ");

       List queryArticleList=session.createQuery(sql).list();

       System.out.println("session: "+session.isOpen()+"   : ");

       return queryArticleList;

    }

 

注意:我们使用getCurrentSession(); 的时候,这个时候的session是不需要我们关闭的。

这样在设置了懒加载为关闭(lazy="false")的状态之后,也是可以立即查询到子对象的数据的。

 

 

 

但是,当我们页面中的很多数据都是不立即需要,或者根据用户的操作才看是否需要的时候,我们很有可能需要设置lazy=true,那么上面的方法就无法解决这个问题了。

 

此时我们也可以通过:OpenSessionInView 来解决这个问题:

 

OpenSessionInViewSpring提供的一个针对Hibernate的一个支持类,其主要意思是在发起一个页面请求时打开HibernateSession,一直保持这个Session,直到这个请求结束。

 

它有两种使用方式:分别是OpenSessionInViewInterceptorOpenSessionInViewFilter,即一个是拦截器,一个是过滤器。

 

具体配置见网络上的文档:

 

OpenSessionInView介绍:

http://baike.baidu.com/link?url=CChyrgUcZmwjqLw_nI3IWFklts91zzVXb7x1juHc7ZksORmbCuvUUjgK3KFkHiJjrsIrWqkpDfWm8GoJSfsd_q

 

分享到:
评论

相关推荐

    struts+spring+hibernate面试题

    - `openSessionInView`模式是在Web层使用Filter打开和关闭Session,确保每个HTTP请求都有一个活跃的Session,以支持延迟加载。 6. Spring的事务管理: - 有两种方式:声明式事务(基于注解或XML配置)和编程式...

    SSH整合 struts+hibernate+spring

    通过这种方式,可以确保在一个HTTP请求的生命周期内,Hibernate的Session始终处于打开状态,从而避免了因Session关闭导致的数据丢失问题。 - **OpenSessionInView模式的关键点**: - 在Web应用的拦截器或过滤器中...

    Struts+Spring+Hibernate开发实例.pdf

    - **OpenSessionInView** 是Hibernate的一个重要概念,它允许在视图层打开一个Session,这样就可以在渲染视图的时候访问数据库。 - **get() 和 set() 方法** 用于对象属性的获取和设置,在文档中被用于封装实体类...

    SSH整合示例项目 hibernate5.2.3+struts2.5.2+spring4.3.3.zip

    - **二级缓存**:提高数据访问效率,OpenSessionInView模式下配合Spring实现 session级缓存。 **OpenSessionInView模式** OpenSessionInView模式是一种解决数据持久层和Web层之间事务管理的策略。在用户请求到达时...

    struts+spring+hibernate面试题.doc

    - **延迟加载**:在session范围内,仅在实际需要时加载关联对象的数据,提高性能。 - **OpenSessionInView**:在Web层通过Filter保持session的打开状态,直到请求结束,确保延迟加载的正常工作。 ### 8. Spring事务...

    SSH项目整合示例【OpenSessionInView】所用到的jar包

    OpenSessionInView(OSIV)模式是SSH整合中常见的一种优化策略,它在用户的一次HTTP请求过程中保持Hibernate Session,避免了多次打开和关闭Session,减少了N+1查询问题,提高了性能。 **Spring** 是一个全面的企业...

    struts spring hibernate面试题

    因为同一个 Action 实例可能会被多个线程共享,导致并发访问时出现问题。 - **解决方案**: - 声明局部变量,避免在 Action 类中使用实例变量。 - 扩展 RequestProcessor,使得每次请求都会创建一个新的 Action ...

    收集的struts+spring+hibernate面试题.doc

    Hibernate 提供了多种查询数据的方式,包括但不限于: - **HQL(Hibernate Query Language)查询**:是一种面向对象的查询语言,类似于 SQL 但更加面向对象。例如,`select u from User u where u.username = ?`。 ...

    struts2+hibernate+spring

    根据提供的文件信息,我们可以推断出这是一篇关于整合Struts2、Hibernate和Spring框架的文章。下面将基于这些信息详细阐述这些技术的关键知识点。 ### Struts2+Hibernate+Spring框架整合 #### 一、概述 Struts2、...

    收集的struts+spring+hibernate面试题借鉴.pdf

    2. Hibernate提供了多种查询数据的方式,包括HQL(Hibernate Query Language)——一种面向对象的查询语言,SQL查询——直接使用标准SQL进行数据操作,以及Criteria API——基于对象的条件查询。 3. Struts中的...

    struts+hibernate,spring面试题

    Struts、Hibernate和Spring(SSH)是Java Web开发中经典的三大框架,它们分别负责MVC模式中的模型(Model)、视图(View)和控制器(Controller)部分。在面试中,了解这些框架的核心概念和实际应用是非常重要的。 ...

    SSH面试题

    - **OpenSessionInView**: 通过Web层的Filter在一次请求周期内保持Session打开,确保所有延迟加载的属性能在Session关闭前完成加载。 #### 八、Spring事务管理 **问题:** Spring支持几种事务管理方式?事务的隔离...

    java程序员ssh面试常见题

    - **知识点概述**:Lazy Loading是一种延迟加载策略,而OpenSessionInView模式则是在整个请求周期内保持Session打开的状态。 - **详细解释**: - **Lazy Loading**:当实体加载时,并不立即加载其关联的集合或属性...

    Spring提供的CharacterEncoding和OpenSessionInView功能

    SSH框架结合了Struts的MVC设计模式、Spring的依赖注入和事务管理以及Hibernate的持久化能力,为Java Web开发提供了强大的支持。然而,随着Spring Boot的兴起,SSH框架的使用逐渐减少,更多地转向了Spring Boot的开箱...

    百度面试题

    - OpenSessionInView模式在Web请求处理过程中保持Hibernate Session打开,直到视图渲染完成,确保数据的一致性。但也可能导致长时间持有数据库连接,增加内存占用。合理控制Session的生命周期对性能至关重要。 10....

    SSH整合文档

    2. **OpenSessionInView模式**: 为了防止Session在请求结束后关闭导致数据丢失,我们可以使用`OpenSessionInViewFilter`。这个过滤器在每次请求开始时打开Session,结束时关闭,保证在整个视图渲染过程中Session都是...

    SSH分页技术详解与实例

    2. **预加载**:使用OpenSessionInView模式,避免因多次打开和关闭Session导致的性能损失。 3. **懒加载**:对于关联对象,可采用懒加载策略,减少数据加载量。 4. **动态SQL**:使用MyBatis或JPA等框架,可以方便...

Global site tag (gtag.js) - Google Analytics