请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

could not initialize proxy - no Session

无法充值


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

正在回答 回答被采纳积分+3

1回答

大漠风 2020-05-11 12:20:21

这个问题一般出现在你的一个对象,如entityA有一个成员变量,entityB,他们通过外键的方式关联,当你查询entityA的时候,Spring Data会通过Lazy Initialize的方式,即懒加载的方式从数据库中获取entityB的数据。但是,这个加载只能在当前的Session中才能成功,当前的Session你可以理解成就是当前的Service的方法,其实也就是当前的事务的上下文范围。

如果你在当前的方法中没有使用entityB的数据,那么这个数据就一直不会被获取,但是,当你需要返回结果时,需要将entityA转成json返回时,或者使用某种前端模块如freemarker等生成页面时,这时候,已经不是在service方法的会话当中,就会出现你所看到的错误。

那么,解决这个问题,有几个方式:

1,修改全局的设置,这个根据你使用的框架会有一些不同,如果是用的freeMarker等,你可能需要设置OpenSessionInViewFilter,如果是spring boot,你可以通过设置 spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true,让他在没有事务的时候,也会获取成员变量的数据。但是,这种方式,可能会大量增加从数据库获取数据的查询操作。

2. 修改EntityA中EntityB的设置,如设置“@OneToOne(fetch = FetchType.EAGER)”,让他不要延时加载,但是这样实际上也是会多进行一次查询,而不是在获取entityA的数据的时候就做关联。

3. 在spring data中的repository中,可以使用自定义的query,加上 "join fetch"。

4. 在service程序中,根据你的业务需要,在需要entityB数据的地方,显式的获取entityB的数据,如做一个判断之类的,或者用“Hibernate.initialize(aa.getEntityB())”的方式初始化等。


0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号