`
muyu114
  • 浏览: 137833 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

解决Hibernate的Session的关闭与开启问题

 
阅读更多

当在使用Hibernate做开发的时候出现org.hibernate.LazyInitializationException: could not initialize proxy - no Session

错误提示

病症:这是一个lazy使用后的Exception,使用迟时加载,在session(hibernate里的session)关闭后使用该对象的未加载变量,也就是说session已经关闭,没有保存到内存中,然后你使用了,导致该异常。
解决方法:

方法1:

<may-to-one>or<one-to-may>lazy属性默认为:lazy = "proxy"
解决:<many-to-one> & <set> 中设置 lazy="false"

如果还不行,根据自己需求,经过我的仔细排查放在set一端不行,那就放在<many-to-one>那端

总结:原因是hibernate的session已经关闭,集合没有被初始化。在hibernate中:hibernate3 默认支持延迟加载(lazy="proxy"我们可以把proxy看作是true),hibernate2 默认立即加载 (lazy="false")。

在hibernate3中,所有的实体设置文件(user.hbm.xml)中的lazy属性都被默认设成了true,就是当这个类没有被调用时,延时加载,导致了以上情况的发生,在配置文件中将lzay属性设为false就可以了。

但是这种方法很是消耗资源


方法2:用openSessionInView

Spring为我们解决最让人头痛的难题之一,Hibernate的Session的关闭与开启问题。
Hibernate 允许对关联对象、属性进行延迟加载,但是必须保证延迟加载的操作限于同一个 Hibernate Session 范围之内进行。如果 Service 层返回一个启用了延迟加载功能的领域对象给 Web 层,当 Web 层访问到那些需要延迟加载的数据时,由于加载领域对象的 Hibernate Session 已经关闭,这些导致延迟加载数据的访问异常。而Spring为我们提供的OpenSessionInViewFilter过滤器为我们很好的解决了这个问题。OpenSessionInViewFilter的主要功能是使每个请求过程绑定一个 Hibernate Session,即使最初的事务已经完成了,也可以在 Web 层进行延迟加载的操作。OpenSessionInViewFilter 过滤器将 Hibernate Session 绑定到请求线程中,它将自动被 Spring 的事务管理器探测到。所以 OpenSessionInViewFilter 适用于 Service 层使用HibernateTransactionManager 或 JtaTransactionManager 进行事务管理的环境,也可以用于非事务只读的数据操作中。

所谓的OpenSessionInView模式,把session的周期交给servlet filter来管理,每当有request进来,就打开一个sessionresponse结束之后再关闭它,这样可以让session存在于整个请求周期中

<<<<<<<<<<<<<<<<<<<<<<<<<<具体的配置方法参考我的“懒加载异常”这篇博文>>>>>>>>>>>>>>>>>>>>>>>>>>

分享到:
评论

相关推荐

    hibernate session生命周期示例

    Hibernate Session是Hibernate的核心接口,它是与数据库交互的主要接口。Session对象负责管理实体对象的状态,包括保存、更新、删除和检索数据。它的生命周期主要包括以下几个阶段: 1. **创建Session**: 当我们...

    hibernate和session学习

    在上述代码中,我们首先通过`SessionFactory`获取`Session`实例,然后开启事务,接着创建一个新的`User`对象并保存到数据库,最后提交事务并关闭`Session`。 在实际应用中,我们通常会将`SessionFactory`和`Session...

    Hibernate的Session的javadoc

    Hibernate的Session接口是Java应用程序与Hibernate之间主要的运行时交互接口,它提供了对持久化对象的创建、读取和删除操作。Session的概念是基于对象的状态管理和数据库事务的,它的生命周期通常与一个物理事务绑定...

    对Hibernate Session做一个简单的包装

    5. **线程安全**:`Session`不是线程安全的,因此在多线程环境中,包装类可能需要考虑如何正确管理和关闭`Session`实例,避免并发问题。 6. **简化API**:根据项目需求,包装类可以提供一些简洁的API,比如`...

    hibernate session详细方法,值得珍藏

    在Java持久化领域,Hibernate无疑占据了举足轻重的地位,而`Hibernate Session`则是其中的核心组件之一,它提供了与数据库交互的主要接口,是对象/关系映射(ORM)的关键部分。本文将深入探讨Hibernate Session的...

    Hibernate_11session

    在Hibernate中,Session与数据库交互时通常是在事务中进行的。你可以使用Session的`beginTransaction()`, `commit()`, 和`rollback()`方法来控制事务的开始、提交和回滚。 ```java Transaction transaction = ...

    hibernate开启二级缓存和查询缓存

    然而,Session 的生命周期较短,一旦 Session 关闭,一级缓存中的数据也会丢失。 #### 1.2 二级缓存 二级缓存是 SessionFactory 级别的全局共享缓存,它可以跨多个 Session 存储和复用数据。二级缓存可以显著减少对...

    Hibernate中获取Session的两种方式代码示例

    Session 是 Hibernate 中一个核心概念,负责管理应用程序与数据库之间的交互。获取 Session 是使用 Hibernate 的第一步骤。下面将详细介绍 Hibernate 中获取 Session 的两种方式代码示例。 什么是 Session? ...

    过滤器对于session周期的控制

    这有助于避免因Session关闭而导致的异常。但是,如果设置为`false`,则每次执行数据库操作时都会创建一个新的Session,这可能导致性能问题以及难以管理的Session生命周期。 #### 总结 综上所述,`...

    模拟hibernate的session.save()功能

    通过这个模拟程序,你可以深入理解Hibernate在持久化对象时所涉及的底层机制,这对于优化你的代码、提高性能和解决实际问题都有很大帮助。同时,这也是一种很好的学习和训练方式,能够增强你对数据库操作和对象持久...

    JAVA的hibernate手动获取session的方法

    Session是Hibernate中的工作单元,它是与数据库交互的主要接口,负责保存、更新和删除对象,同时提供查询功能。在Java应用中,我们需要先初始化SessionFactory,然后通过SessionFactory来创建Session实例。 以下是...

    hibernate的缓存机制和session对象的产生方式案例

    通过begin()开启事务,Hibernate会自动创建Session,然后在commit()或rollback()时关闭Session。这种方法简化了代码,但可能导致Session生命周期过长,增加内存压力。 总的来说,理解和熟练运用Hibernate的缓存机制...

    hibernate5--2.数据持久化及事务

    - **脱管态(Detached)**:对象曾是持久态,但Session关闭后,对象与Session的关联断开,此时对象的状态可能已与数据库不同步。 **2. Hibernate的事务管理** 在Java应用中,事务处理是确保数据一致性的重要手段。...

    Hibernate 体系结构与工作原理.txt

    Hibernate 的设计目标是解决传统 JDBC 编程中的复杂性问题,如资源管理、事务处理等,并通过其自身的体系结构实现了这一目标。 #### 二、Hibernate 的体系结构 Hibernate 的体系结构可以分为以下几个主要部分: 1...

    day36 11-Hibernate中的事务:当前线程中的session

    当Session关闭时,如果之前没有遇到异常,那么事务就会被提交;如果有异常,事务会被回滚,从而实现了自动的事务回滚策略。这种机制大大简化了事务管理,使得开发者能更专注于业务逻辑。 在实际应用中,我们可以...

    hibernate3 hibernate3

    Hibernate3 是一个强大的Java持久化框架,用于简化数据库与对象之间的交互。它是对象关系映射(ORM)工具的典范,允许开发人员使用面向对象的编程模型来操作数据库,而无需直接编写SQL语句。在本篇文章中,我们将...

    hibernate一级和二级缓存配置与详解

    当Session关闭时,一级缓存中的数据将被清除。 #### 一级缓存的配置 一级缓存无需额外配置,因为它是Hibernate的默认行为。但是,可以通过设置`hibernate.cache.use_query_cache`来禁用查询缓存,防止对一级缓存...

    Hibernate与struts2结合使用的demo

    编写HibernateInterceptor,负责开启和关闭Session,以及处理异常。 ```java public class HibernateInterceptor implements Interceptor { public void destroy() {} public void init() {} public String ...

    Hibernate4.1环境搭建

    通过上述步骤,我们可以成功地搭建起Spring4.1 + Hibernate4 + Struts2的环境,并解决了session数据为空的问题。在实际开发中,还需要根据具体的应用场景对配置进行适当的调整,以确保应用能够稳定运行。同时,熟练...

    Hibernate个人博客设计与实现

    Hibernate提供了事务管理功能,可以通过`session.beginTransaction()`和`transaction.commit()`进行事务的开启和提交。 8. **关联映射** 博客系统中的实体间可能存在关联,如用户与文章之间的一对多关系,文章与...

Global site tag (gtag.js) - Google Analytics