开发环境:Spring2.5+Hibernate3.2+XFire我有两张表,人员表和部门表,它们之间是多对一的关系 <many to one>。定义好Web Service后,实现了一个方法获取全部人员表记录。这时调用这个方法,会报错:org.hibernate.LazyInitializationException could not initialize proxy - no Session。判断是由Hibernate的延迟加载机制引起的,在实体表的映射关系中加入lazy="false",可以正常获取数据。但从显示的 SQL语句来看,Hibernate不仅查询了人员表的记录,同时也查询了部门表的记录,这样效率非常的低下。然后在web.xml配置文件中设置 OpenSessionInViewFilter,配置如下:
<!-- 过滤spring中对于hibernate的session关闭管理 -->
<filter>
<filter-name>OpenSessionInViewFilter </filter-name>
    <filter-class>
            org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
        </filter-class>
    <init-param>     
    <!-- singleSession默认为true,若设为false则等于没用OpenSessionInView --> 
        <param-name>singleSession </param-name>
        <param-value>true </param-value>   
    </init-param>
</filter>
<filter-mapping> 
    <filter-name>OpenSessionInViewFilter </filter-name> 
    <url-pattern>/* </url-pattern> 
</filter-mapping>然后关闭lazy="false"设置,再次调用方法,还是报一样的错误:org.hibernate.LazyInitializationException could not initialize proxy - no Session。请问OpenSessionInViewFilter这如何才能正常生效?附上Web服务的方法:
public List<HrPersonFile> LoadFileInfo(){
ApplicationContext ctx = 
new ClassPathXmlApplicationContext("applicationContext.xml");
try{
HrPersonFileDAO d = (HrPersonFileDAO)ctx.getBean("HrPersonFileDAO");
return d.findAll();
}
catch(Exception e){
log.error(e);
return null;
}
}

解决方案 »

  1.   

    配制是对的,但是不晓的xFire 与Spring 的集成的时候有没有这个错就是晓的了,
      

  2.   

    配置贴的倒是没有错误
    在XFire中如何生效这个倒是没用过呢
      

  3.   

    是延迟加载的问题,你可以参照opensessioninviewfilter解决,希望你能搞定
      

  4.   

    没有用过xfire,有点怀疑<url-pattern>/* </url-pattern> 
      

  5.   

    你把<filter-class> 
                org.springframework.orm.hibernate3.support.OpenSessionInViewFilter 
            </filter-class> 
    换成自己写的一个测试filter,看一下访问webservice的时候有没有执行
      

  6.   


    测试过了,访问webservice的时候,确实执行我指定的过滤类。
      

  7.   

    根据你xfire的 url-pattern 配置 
    配置相应的 hibernateFilter 
        <filter-mapping>
            <filter-name>hibernateFilter</filter-name>  
            <url-pattern>/service/*</url-pattern> 
        </filter-mapping>