就是问Spring是如何管理Hibernate Session的我现在只是想明白 假设我用了延迟加载 或者我需要对QUERY进行一些操作(这样的话就不能用HibernateDaoSupport的查询方法了) 在这种情况下我要如何管理SESSION 比如什么时候开 什么时候关 是手动执行开关 还是自动执行开关 我基本上不会SPRING 只是稍微有些了解 看看你们都是怎么做的 我表达能力有问题 不知道该咋问 抱歉抱歉..

解决方案 »

  1.   

    用spring 管理事务就不需要手动去开关session
    如果有延迟加载可以加上在web.xml中加spring的OpenSessionInViewFilter
      

  2.   

    首先,在service层的方法配置事务,这样spring会在service的方法结束后关闭session,对于延迟加载的属性,如果在view层需要用到,就必须在service层预先初始化。
    为了解决延迟加载的问题,可以用opsesionInView来解决,这样即使在jsp里也可以访问延迟加载的属性,而不必自己去预先初始化
    <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>/*</url-pattern>
    </filter-mapping>
    可是对于大的应用这样会有性能问题,所以一般大的系统不使用这种方式
      

  3.   


    这样的话 那我是不是可以关闭SESSION?
      

  4.   

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="
           http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.springframework.org/schema/tx
           http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
           http://www.springframework.org/schema/aop
           http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
      

     
    <bean id="dataSource"
    class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName"
    value="oracle.jdbc.driver.OracleDriver">
    </property>
    <property name="url"
    value="jdbc:oracle:thin:@124.0.0.1:1521:revict1">
    </property>
    <property name="username" value="xx"></property>
    <property name="password" value="xxx"></property>
    </bean>


    <bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource">
    <ref bean="dataSource" />
    </property>
    <property name="hibernateProperties">
    <props>
    <prop key="hibernate.dialect">
          org.hibernate.dialect.OracleDialect
    </prop>
    <prop key="hibernate.show_sql">true</prop>
    </props>
    </property>
    <property name="mappingLocations">
    <value>classpath:/com/revic/lms/*/po/*.hbm.xml</value>
    </property>
    <property name="lobHandler">
    <ref bean="lobHandler" />
    </property>
    </bean>
    <bean id="nativeJdbcExtractor" lazy-init="true"  class="org.springframework.jdbc.support.nativejdbc.SimpleNativeJdbcExtractor"/> <bean id="lobHandler" lazy-init="true"   class="org.springframework.jdbc.support.lob.OracleLobHandler">
            <property name="nativeJdbcExtractor">
                <ref bean="nativeJdbcExtractor"/>
            </property>
    </bean> 
    <!-- 配置事务管理器 -->
    <bean id="transactionManager"
    class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory">
    <ref bean="sessionFactory" />
    </property>
    </bean> <!-- 配置事务的传播特性 -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        
    <tx:method name="add*" propagation="REQUIRED" />
    <tx:method name="del*" propagation="REQUIRED" />
    <tx:method name="modify*" propagation="REQUIRED" />
    <tx:method name="update*" propagation="REQUIRED" />
    <tx:method name="*" read-only="true" />
    </tx:attributes>
    </tx:advice> <!-- 那些类的哪些方法参与事务 -->
    <aop:config>
    <aop:pointcut id="allManagerMethod"
    expression="execution(* com.revic.lms.*.*(..))" />
    <aop:advisor pointcut-ref="allManagerMethod"
    advice-ref="txAdvice" />
    </aop:config>
    </beans>
      

  5.   


     <!-- 配置事务的传播特性 -->

    <!-- 那些类的哪些方法参与事务 -->
    是干哈用的?配置这些东西之后 DAO该咋写 给个例子可以木? 谢谢谢谢
      

  6.   

    如果上面的配置文件楼主看不懂的话,建议自己去看spring资料学习一下,或者spring中文参考手册这个不是一句话两句话能讲明白滴
      

  7.   

    OpenSessionInView这东西的优劣早就讨论过了,我并不认为将数据库事务的session带到view这一层是一个好主意,这是没办法的无能之举。你的设计,之所以要lazy,必然有其原因,你应该在设计上考虑,而不是用这个垃圾OpenSessionInView方式。
      

  8.   

    如果有lazy,我一般考虑增加一个get方法,让其每次都调用一下lazy的,这样那些东西就出来了。毕竟,需要读取lazy数据的情况还是少数。
      

  9.   


    可问题是我做的东西并不大 是个很SMALL的东西 而且我比较新手 对有些事情把握不好 不知该如何去做 lazy可以不用考虑 但是我就是搞不懂 如何管理SESSION 因为之前一直都是手动操作SESSION的
      

  10.   

    那如果我要是用公共的DAO呢? 这样的话我就没办法详细获得查询出来的东西了 
      

  11.   

    我现在用getCurrentSession()获得SESSION 然后不用延迟加载了 怎样?