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

本文介绍了Hibernate框架中懒加载异常LazyInitializationException的原因及三种解决方案,包括配置禁用懒加载、显式初始化代理对象以及通过openSessionInView模式扩大Session作用域。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

异常:Exception in thread "main" org.hibernate.LazyInitializationException: could not initialize proxy - no Session
这是因为session已经关闭。
有两张解决方式:
1.(1)在*.hbm.xml(也就是one)中配置
 <class name="com.ht.domain.Student" lazy="false" table="STUDENT" schema="SCOTT">

明确告诉hibernate框架:如果session没有就创建一个session,完成查询任务

(或者)

(2)<many-to-one> & <set> 中设置 lazy="false" 
这两种虽都 解决了大部分的延时加载问题 ,但是同事也降低了系统的性能 不建议。

初学者可以使用强两种方式解决问题,但在实际开发中,使用的是第三种...

取消lazy,不要在one-to-many中one的一方的<set/>配置,可以在many中配置

2.显示初始化代理对象:

比如要查找的是emp表 雇员的部门名字

可以在session开启后,加上一条:

Hibernate.initialize(emp.getDept());

这条语句的作用是:跟emp对象绑定的dept对象也一起返回...

上面两种方式是不好的,因为再后来dept使不使用,它都会发出sql语句

3.通过openSessionInview来解决懒加载(思想就是扩大session的范围)

建立一个Filter过滤器,doFilter()方法中添加如下代码,以后使用的session都是是getCurrentSession();

session = HibernateUtil.getCurrentSession();
tx = session.beginTransaction();

chain.doFilter(servletRequest, servletResponse);

tx.commit();

4.整合ssh后,spring专门提供openSessionInView的方法来解决懒加载,需要在web.xml中添加如下配置
<filter>
           <filter-name>openSessionInViewFilter</filter-name>
           <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
          <filter-name>openSessionInViewFilter</filter-name>
            <url-pattern>/*</url-pattern>
</filter-mapping>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值