Spring管理Session何时打开何时关闭的呢?我在项目中直接super.getHibernateTemplate().find("");但是一直感觉到很奇怪,因为在用hibernate的时候都要打开session为什么用Spring的时候就不需要打开session呢?请高手指教,那么Session何时打开何时关闭的?

解决方案 »

  1.   

    因为spring已经帮你做了这些事情 不需要你做了
      

  2.   

    spring事务已经帮你把这些都做了,不用再自己动手去打开session或关闭session
      

  3.   

    在事务开始的时候打开Session,事务完成后关闭Session,使用Hibernate和Spring都需要这个操作,只不过Spring内部封装好了方法来自动打开和关闭Session,不需要手动关闭了!
      

  4.   

    因为hibernate的事务交给了SPring管理。你去看applicationCOntext.xml中就看到有事务配置。通过AOP,在你的业务方法执行前打开事务,开启session,执行后就关闭事务,关闭session.
      

  5.   

    spring中不是把session交给org.springframework.orm.hibernate3.HibernateTransactionManager这个类管理了吗?
      

  6.   

    你加入的Spring支持里不是有SessionFactory吗?你自己看看,有没有打开和关闭session的方法?????
      

  7.   

    会不会是这样
    SessionFactory sf;
    public HibernateTemplate getHibernateTemplate() {
        //...
        Configuration cfg = new Configuration().configure(...xml);
        sf = cfg.buildSessionFactory();
    }public List find(String hql) {
        Session session = sf.openSession();
        session....
        session.close();
    }
      

  8.   

    一般来说spring内部已经封装了对Hibernate的session的开启和关闭,但是是它是在你用到super.getHibernateTemplate()时就会开启session,用完session就会关闭,事务就会自动提交 LZ如果想要控制session的开启和关闭,可以在application.xml里进行事务通知配置 <!--配置事务管理器-->
    <bean id="myManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"><property name="sessionFactory" ref="sessionFactory"></property>
    <tx:advice id="txAdvice" transaction-manager="myManager"> <tx:attributes>
    <!--配置需要事务提交的方法-->
    <tx:method name="find*"  propagation="SUPPORTS"/><!--在查询方法执行完后事务不需进行提交-->
    <tx:method name="add*" propagation="REQUIRED" rollback-for="Exception"/><!--在执行增加数据的时候需要提交,这时只有add方法执行完session才会关闭,事务就会提交-->

    </tx:attributes>
    </tx:advice>
    <aop:config>

    <aop:pointcut expression="execution(* .*.* (..))" id="pc"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="pc"/>
    </aop:config>
      

  9.   

    另外要想让session持续一段时间再关闭还可以在web.xml中进行OpenSessionInViewFilter配置
    <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>
      
    这样只有当当前请求(request)关闭,session才会相应关闭,LZ可以google这方面的资料