在使用spring+hibernate的时候遇到一点疑问,请高人指点迷津!1,当使用Hibernate延时加载时,用getSession.load(xx.class,new Long(1));方法出现了NO SESSION异常。
   经过BAIDU上狂搜,结果发现使用spring提供的openSessionInViewFilter能解决问题。
   但是,好象用了openSessionInViewFilter以后,可能会在执行saveorupdate等业务时出现异常。不知如何解决。2,各位在开发项目时,鉴于尽可能的少发送SQL语句并且节省资源的情况下,通常用哪种加载机制?

解决方案 »

  1.   

    是不是代码有问题啊?我也遇到过no session的问题,通常是由于在事务结束之后再执行其它数据库操作引起的。
    例如:
    @Transactional
    public void doA(Object obj){
       getSession.load(obj);
    }public void doB(Object obj){
       getSession.load(xx.class,new Long(1));
    }public void main(){
      ...
      doA();
      ...
      doB();  //这时可能会出现no session异常
    }把事务注释标签移到main()方法上就OK了。
      

  2.   

    不是,是因为采用了延时加载,对象还没读取,SESSION已经关了
      

  3.   

    你要先看看 openSessionInView 模式。
      

  4.   

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.5" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
      <filter>
            <filter-name>hibernateFilter</filter-name>
            <filter-class>
                org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
            </filter-class>
            <init-param>      
            <param-name>singleSession</param-name>
            <param-value>true </param-value>   
        </init-param>
      </filter>
      <filter-mapping>
            <filter-name>hibernateFilter</filter-name>
            <url-pattern>/*</url-pattern>
      </filter-mapping>
     
        
      <filter>
        <filter-name>Set Character Encoding</filter-name>
        <filter-class>com.essh.util.SetCharacterEncodingFilter</filter-class>
        <init-param>
          <param-name>encoding</param-name>
          <param-value>GBK</param-value>
        </init-param>
        <init-param>
          <param-name>ignore</param-name>
          <param-value>true</param-value>
        </init-param>
      </filter>
      <filter-mapping>
        <filter-name>Set Character Encoding</filter-name>
        <servlet-name>action</servlet-name>
      </filter-mapping>
      
      <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/classes/applicationContext.xml</param-value>  
      </context-param> 
      
      <listener>
            <listener-class>
                org.springframework.web.context.ContextLoaderListener
            </listener-class>
      </listener>
      
      <servlet>
        <servlet-name>action</servlet-name>
        <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
        <init-param>
          <param-name>config</param-name>
          <param-value>/WEB-INF/struts-config.xml</param-value>
        </init-param>
        <init-param>
          <param-name>debug</param-name>
          <param-value>3</param-value>
        </init-param>
        <init-param>
          <param-name>detail</param-name>
          <param-value>3</param-value>
        </init-param>
        <load-on-startup>0</load-on-startup>
      </servlet>
      <servlet-mapping>
        <servlet-name>action</servlet-name>
        <url-pattern>*.do</url-pattern>
      </servlet-mapping>
      <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
      </welcome-file-list>
    </web-app>能帮忙看下openSessionInViewFilter的配置吗?配完以后还是no Session