在hibernate中使用load(延迟加载)方法时,并未把数据真正获取时就关闭了session,当我们真正想获取数据时会迫使load加载数据,而此时 session已关闭,所以就会出现异常。
比较典型的是在MVC模式中,我们在M层调用持久层获取数据时(持久层用的是load方法加载数据),当这一调用结束时,session随之关闭,而我们希望在V层使用这些数据,这时才会迫使load加载数据,我们就希望这时的session是open着得,这就是所谓的Open Session In view 。
我们可以filter来达到此目的, 也可以用interceptor来做。
filter:
<filter>
<filter-name>OpenSessionInViewFilter</filter-name>
<filter-class>org.springframework.orm.hibernate5.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>OpenSessionInViewFilter</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
interceptor:
importorg.springframework.orm.hibernate3.support.HibernateDaoSupport;
public classXxxDAO extends HibernateDaoSupport {
<span style="white-space:pre"> </span>public void save(Xxx transientInstance) {
<span style="white-space:pre"> </span>try{
<span style="white-space:pre"> </span>getHibernateTemplate().save(transientInstance);
<span style="white-space:pre"> </span>}catch(RuntimeException re) {
<span style="white-space:pre"> </span>throwre;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}
}
注意:<url-pattern>/*</url-pattern>中最好不要写/*, 因为这样的话,访问所有的url都会为其开一个session,造成性能的下降;