could not initialize proxy - no Session 问题解决

在使用spring+hibernate时,我们对实体的一对多,多对一和多对多的关联实体进行获取值的时候通常会使用懒加载的方式。这样做的好处就是在我们需要关联对象的属性的时候,再去查询数据库,以至于我们不用一次查询很多的数据出来。

这样做经常会遇到一个异常:could not initialize proxy - no Session,本文就对此异常做各种处理方式的总结,结合实际需求去排除错误。

具体原因:使用懒加载方式,第一次获取主体对象后session已经关闭了,所以再去查询关联对象的属性时,没有session可以使用。

解决办法:

1. 使用fetch = FetchType.EAGER,即不使用懒加载,这样一次性就加载所有的属性,包括主体,关联实体。

好处:避免了懒加载session不存在。

坏处:丢失了懒加载的特性,一次加载数据过多对于程序效率有所影响。

2. 手动的控制session的开关。即自己打开一个session,并在使用完成以后手动的显示关闭该session。

Session session = sessionFactory.openSession();
// 通过session去查询对应的实体
User user = session.find(id);
// 获取关联对象
List<Role> roles = user.getRoles();
// 使用关联对象
for(Role role : roles) {
    System.out.println(role.getName());
}

好处:使用懒加载特性,需要时再获取。

坏处:需要手动的去控制session的开关。

应用场景:如spring容器启动时,需要去获取某对象关联的属性。或者Junit单元测试时。

3. 增加openSessionInView Filter,通过该filter来帮助实现session的开关控制。

<filter>
    <filter-name>openSessionInView</filter-name>
    <filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>openSessionInView</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

好处:我们不需要手动的去控制session的开关。

坏处:对于像没有使用web容器,或者web容器并未启动,亦或者根本就没有发送请求即没有通过该Filter,则无法完成该功能。这种情况只有使用解决方法二。

应用场景:web应用,有请求发生并且请求被Filter拦截的情况

时间: 2024-08-01 03:11:07

could not initialize proxy - no Session 问题解决的相关文章

org.hibernate.LazyInitializationException: could not initialize proxy - no Session

在<many-to-on>中这错误很常见,字面意义就是不能被初始化,因为session已经关闭了. 简单理解就是因为,你使用了lazy=true,这样hibernate在从数据库中调数据的时候是不会把关联的对象查出来的,而是保存一个获取值得方法,在你使用getXXX()调用的时候,hiberante会利用这个保存的方法去从数据库中取数据.而往往我们在jsp页面中使用getXXX()准备展示数据的时候,session早已经在dao中就关闭了,我们该如何解决这种异常呢? 简单的说有三种:1.把la

懒加载异常org.hibernate.LazyInitializationException: could not initialize proxy - no Session

错误页面提示 could not initialize proxy - no Session 控制台 org.hibernate.LazyInitializationException: could not initialize proxy - no Session 病症:这是一个lazy使用后的Exception,使用迟时加载,在session(hibernate里的session),关闭后使用该对象的未加载变量,也就是说session已经关闭,没有保存到内存中,然后你使用了,导致该异常. Q

hibernate4 could not initialize proxy - no Session

相关代码链接: http://git.oschina.net/alexgaoyh/alexgaoyh 上周在编写hibernate4的相关代码的时候,出现异常 org.hibernate.LazyInitializationException: could not initialize proxy - no Session  网上出现最多的解决方案是  openSessionInViewFilter 形如: <!-- open session filter --> <filter>

NHibernate之&quot;Could not initialize proxy - no Session&quot; Bug

最近在看一个 叫 泰斗破坏神的项目 里面用到了 NHibernate 这里涉及到了 联表查询 我的映射是在类里面,和网上在XML里的不一样 当我运行时,它会报错  Could not initialize proxy - no Session 网上查了的意思是  数据还没找完 Session就已经销毁了 映射表默认的是lazy=true;就是延迟加载的意思,因为延迟加载导致Session销毁了,然后我在想能不能 找到一个修改lazy的方法,可是最后找不到. 所以最后想到一个简单的方法就是  既然

ssh整合案例出了could not initialize proxy - no Session 问题,那个大神帮我看看

在做SSH项目时,控制台出现这个错误,请大神帮忙看看啊2017-04-14 11:15:57,902 DEBUG (org.springframework.beans.factory.support.DefaultListableBeanFactory:1140) - Added autowiring by name from bean name 'cn.bdqn.jboa.action.EmployeeAction' via property 'employeeBiz' to bean nam

懒加载的解决方法(全)org.hibernate.LazyInitializationException: could not initialize proxy - no Session

如下错误:org.hibernate.LazyInitializationException: could not initialize proxy - no Session 原因是懒加载的问题,因为hibernate的机制是当我们查询一个对象的时候,在默认情况下,返回的只是该对象的普通属性,当用户去使用对象属性的时候,才会向数据库再一次查询,可以这时session已经关闭了,无法对数据库进行查询. 举例:在界面显示雇员所在的部门名称${loginuser.department.name } 解

【bug记录】jpa 解决org.hibernate.lazyinitializationexception could not initialize proxy - no session

前言 最近开发项目比较忙,springcloud的笔记得稍稍放放了,下午出来个bug,恶心的不行,功能很简单,也没有什么级联或复杂的映射关系,就是一直在报三个异常 Caused by: com.fasterxml.jackson.databind.JsonMappingException: No serializer found for class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer and no propert

LazyInitializationException: could not initialize proxy no session

这完全是框架设计者的锅,讲道理  无论是SSH SSM都太重了, Hibernate几乎把SQL完全封装了一遍,简单的一对多关系,如果开启LazyLoad 这样实体类会被代理,直到访问这个多方实体的属性的时候,才会加载 在webxml中加入 <filter> <filter-name>Spring OpenEntityManagerInViewFilter</filter-name> <filter-class>org.springframework.orm

could not initialize proxy - no Session

只需要把关联类配置lazy='false',也就是立即加载 例如: public class stu{ private int stuid; } public class score{ private stu s; } stu.cfg.xml把lazy='false'