hibernate什么时候会抛出懒加载的异常

本文详细解释了Hibernate懒加载机制中常见的异常问题,特别是当Session关闭后尝试访问懒加载关联对象时引发的异常。通过一个具体示例说明了如何复现这一问题,并探讨了解决方案。

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

Hibernate的延迟加载,很多资料里叫懒加载。
懒加载的异常有很多种,你指的是不是session已经关闭的异常?因为那个初学者最容易遇到
情况是当你加载出一个一对多关系的一这端的对象,然后在出了事务之后的地方,比如页面上,还想再获取多端对象里面的除了id以外的属性的时候,就会跑出这个异常。
我举个例子,你有一个 Grade 对象关联了 很多 Student 对象,并且用的是懒加载
你在service里面通过数据库查询获得了一个 Grade对象,这个对象里面有一个Set<Student> students 集合,但是你并没有对这个对象做进一步的处理(比如 intialize之类的操作让懒加载的代理对象真正去实例化)
然后你到了页面的展示的时候,去遍历 students 这个集合,并且你试图在页面上显示每个 student 的 name 属性(这个属性不是studentId) 这个时候就会抛出session已经关闭的异常
 
最简单的方法就是我们所有的表都设置的是lazy=false,因为之前在写程序的时候一直发现无法访问到关联表的值,(比如有Person和Bulletin两张表,两者是一对多的关系),使用lazy=true时,person.bulletin会报异常,所以就武断的将所有表都设置成了lazy=false,结果可想而知,慢的要死,所有表都设置为lazy=false可能会导致每次数据库操作都会查询数据库中所有的表。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值