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用链接查询解决懒加载,但是当一个类映射多个集合时,她有多种一对多的关系集合,用链接查询就需要将所有关联的多的集合都连接起来

posted @ 2022-09-23 18:02  silentmuh  阅读(472)  评论(0编辑  收藏  举报
Live2D