Hibernate延迟加载 或 no session or session was closed 问题的解决(OpenSessionInViewFilter使用)
在Hibernate配置文件中配置many-to-one 或者 one-to-many 等情况时.设置lazy="true"时 在查询对结果操作时会出现以上情况.将lazy="true" 改为 lazy="false" 可以解决问题.但那就脱离了延迟加载.
实现延迟加载的解决办法由很多.我采用了比较简单的方法:
使用:OpenSessionInViewFilter
在web.xml 添加如下代码即可:
<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>hibernateFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
(以上代码struts2.0据说需要在web.xml中作为第一个filter,即所有filter的上面。位置不对可能不起作用)
如果你是通过struts配置文件中以 ContextLoaderPlugIn插件 认识spring配置文件的话,那么 OpenSessionInViewFilter 加载的spring配置文件极可能与插件加载的不是同一个对象.因为他们的key值不一样.解决办法是删除、注释掉struts配置文件中的ContextLoaderPlugIn。在web.xml中认识:
web.xml 中添加:
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
以上代码可解决:No WebApplicationContext found: no ContextLoaderListener registered异常
它回去查找默认文件名为applicationContext.xml的文件,如果你的名字不一样 需要显示配置该文件。以上工作完成后即可实现,Hibernate延迟加载。