当在使用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进来,就打开一个session,response结束之后再关闭它,这样可以让session存在于整个请求周期中
<<<<<<<<<<<<<<<<<<<<<<<<<<具体的配置方法参考我的“懒加载异常”这篇博文>>>>>>>>>>>>>>>>>>>>>>>>>>
分享到:
相关推荐
Hibernate Session是Hibernate的核心接口,它是与数据库交互的主要接口。Session对象负责管理实体对象的状态,包括保存、更新、删除和检索数据。它的生命周期主要包括以下几个阶段: 1. **创建Session**: 当我们...
在上述代码中,我们首先通过`SessionFactory`获取`Session`实例,然后开启事务,接着创建一个新的`User`对象并保存到数据库,最后提交事务并关闭`Session`。 在实际应用中,我们通常会将`SessionFactory`和`Session...
Hibernate的Session接口是Java应用程序与Hibernate之间主要的运行时交互接口,它提供了对持久化对象的创建、读取和删除操作。Session的概念是基于对象的状态管理和数据库事务的,它的生命周期通常与一个物理事务绑定...
5. **线程安全**:`Session`不是线程安全的,因此在多线程环境中,包装类可能需要考虑如何正确管理和关闭`Session`实例,避免并发问题。 6. **简化API**:根据项目需求,包装类可以提供一些简洁的API,比如`...
在Java持久化领域,Hibernate无疑占据了举足轻重的地位,而`Hibernate Session`则是其中的核心组件之一,它提供了与数据库交互的主要接口,是对象/关系映射(ORM)的关键部分。本文将深入探讨Hibernate Session的...
在Hibernate中,Session与数据库交互时通常是在事务中进行的。你可以使用Session的`beginTransaction()`, `commit()`, 和`rollback()`方法来控制事务的开始、提交和回滚。 ```java Transaction transaction = ...
然而,Session 的生命周期较短,一旦 Session 关闭,一级缓存中的数据也会丢失。 #### 1.2 二级缓存 二级缓存是 SessionFactory 级别的全局共享缓存,它可以跨多个 Session 存储和复用数据。二级缓存可以显著减少对...
Session 是 Hibernate 中一个核心概念,负责管理应用程序与数据库之间的交互。获取 Session 是使用 Hibernate 的第一步骤。下面将详细介绍 Hibernate 中获取 Session 的两种方式代码示例。 什么是 Session? ...
这有助于避免因Session关闭而导致的异常。但是,如果设置为`false`,则每次执行数据库操作时都会创建一个新的Session,这可能导致性能问题以及难以管理的Session生命周期。 #### 总结 综上所述,`...
通过这个模拟程序,你可以深入理解Hibernate在持久化对象时所涉及的底层机制,这对于优化你的代码、提高性能和解决实际问题都有很大帮助。同时,这也是一种很好的学习和训练方式,能够增强你对数据库操作和对象持久...
Session是Hibernate中的工作单元,它是与数据库交互的主要接口,负责保存、更新和删除对象,同时提供查询功能。在Java应用中,我们需要先初始化SessionFactory,然后通过SessionFactory来创建Session实例。 以下是...
通过begin()开启事务,Hibernate会自动创建Session,然后在commit()或rollback()时关闭Session。这种方法简化了代码,但可能导致Session生命周期过长,增加内存压力。 总的来说,理解和熟练运用Hibernate的缓存机制...
- **脱管态(Detached)**:对象曾是持久态,但Session关闭后,对象与Session的关联断开,此时对象的状态可能已与数据库不同步。 **2. Hibernate的事务管理** 在Java应用中,事务处理是确保数据一致性的重要手段。...
Hibernate 的设计目标是解决传统 JDBC 编程中的复杂性问题,如资源管理、事务处理等,并通过其自身的体系结构实现了这一目标。 #### 二、Hibernate 的体系结构 Hibernate 的体系结构可以分为以下几个主要部分: 1...
当Session关闭时,如果之前没有遇到异常,那么事务就会被提交;如果有异常,事务会被回滚,从而实现了自动的事务回滚策略。这种机制大大简化了事务管理,使得开发者能更专注于业务逻辑。 在实际应用中,我们可以...
Hibernate3 是一个强大的Java持久化框架,用于简化数据库与对象之间的交互。它是对象关系映射(ORM)工具的典范,允许开发人员使用面向对象的编程模型来操作数据库,而无需直接编写SQL语句。在本篇文章中,我们将...
当Session关闭时,一级缓存中的数据将被清除。 #### 一级缓存的配置 一级缓存无需额外配置,因为它是Hibernate的默认行为。但是,可以通过设置`hibernate.cache.use_query_cache`来禁用查询缓存,防止对一级缓存...
编写HibernateInterceptor,负责开启和关闭Session,以及处理异常。 ```java public class HibernateInterceptor implements Interceptor { public void destroy() {} public void init() {} public String ...
通过上述步骤,我们可以成功地搭建起Spring4.1 + Hibernate4 + Struts2的环境,并解决了session数据为空的问题。在实际开发中,还需要根据具体的应用场景对配置进行适当的调整,以确保应用能够稳定运行。同时,熟练...
Hibernate提供了事务管理功能,可以通过`session.beginTransaction()`和`transaction.commit()`进行事务的开启和提交。 8. **关联映射** 博客系统中的实体间可能存在关联,如用户与文章之间的一对多关系,文章与...