failed to lazily initialize a collection of role: could not initialize proxy - no Session
hibernate 中,在关联一对多时,默认懒加载,在DAO层,用session取值的时候,只会取当前“一”的对象,取完值后session关闭了,
但是在显示层需要用到“多”对象的数据,由于此时session已经关闭,再取“多”的值就会报错
failed to lazily initialize a collection of role: could not initialize proxy - no Session
两种方案:
一在session关闭之前,将关联的“多”集合取值
方法2 3 5即是
二绑定当前线程,使session保持open
方法1 4即是
解决办法:
1在配置文件里添加过滤器,本人项目中用到的hibernate4所以用的是org.springframework.orm.hibernate4.support.OpenSessionInViewFilter
如果用的是hibernate3,则是org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
<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>
filter尽量写在前面,因为加载顺序不同
2lazy=false;
3在DAO取值时,即在session.close()这行代码执行之前,通过Hibernate.initialize方法强制读取数据 ,这个方法本人试了之后没起作用
4org.springframework.orm.hibernate4.support.openSessionInViewInterceptor
<beans> <bean name="openSessionInViewInterceptor" class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor"> <property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="interceptors">
<list> <ref bean="openSessionInViewInterceptor"/> </list>
</property>
<property name="mappings">
</property>
...
</bean> ... </beans>
5用链接查询解决懒加载,但是当一个类映射多个集合时,她有多种一对多的关系集合,用链接查询就需要将所有关联的多的集合都连接起来
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!