您的位置:首页 > 大数据 > 人工智能

failed to lazily initialize a collection of role: could not initialize proxy - no Session

2018-01-22 13:46 579 查看
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用链接查询解决懒加载,但是当一个类映射多个集合时,她有多种一对多的关系集合,用链接查询就需要将所有关联的多的集合都连接起来
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐