开发环境: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;
}
}
<!-- 过滤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;
}
}
在XFire中如何生效这个倒是没用过呢
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
</filter-class>
换成自己写的一个测试filter,看一下访问webservice的时候有没有执行
测试过了,访问webservice的时候,确实执行我指定的过滤类。
配置相应的 hibernateFilter
<filter-mapping>
<filter-name>hibernateFilter</filter-name>
<url-pattern>/service/*</url-pattern>
</filter-mapping>