我的配置文件是这样的:<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"><beans>
 <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
  <property name="configLocation">
    <value>classpath:com/danlong/common/config/ehcache.xml</value>
  </property>
</bean>

<bean id="methodCache" class="org.springframework.cache.ehcache.EhCacheFactoryBean">
  <property name="cacheManager">
    <ref local="cacheManager"/>
  </property>
  <property name="cacheName">
    <value>person.danlong.METHOD_CACHE</value>
  </property>
</bean>

<bean id="methodCacheInterceptor" class="com.danlong.common.interceptor.MethodCacheInterceptor">
  <property name="cache">
    <ref local="methodCache" />
  </property>
</bean>

<bean id="methodCachePointCut" abstract="true" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
  <property name="advice">
    <ref local="methodCacheInterceptor"/>
  </property>
  <!-- property name="pattern">
      <value>.*findMenuRepository</value>
  </property-->
</bean>

     <!-- JNDI DataSource for J2EE environments -->
    <bean id="jndiDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiName"><value>java:comp/env/jdbc/oracle</value></property>
    </bean>
<bean id="dataSource" class="com.danlong.common.database.DelegatedDataSource">
<property name="dataSource">
<ref local="jndiDataSource"/>
</property>
</bean>

<bean name="initialEnvironment" class="com.danlong.common.support.InitialEnvironment" parent="/myarea/userManager">
<property name="production"><value>false</value></property>
</bean>

<!-- Hibernate SessionFactory -->
    <bean id="sessionFactory" class="com.danlong.common.support.HibernateHelpSessionFactoryBean" 
     depends-on="hibernateMappingFileSetUtil">
        <property name="dataSource"><ref bean="dataSource"/></property>
        
        <property name="mappingResources">
         <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="targetObject"><ref local="hibernateMappingFileSetUtil"/></property>
<property name="targetMethod"><value>getLists</value></property>
</bean>
<!--<list>
<value>com/danlong/common/vo/TbOrderStatus.hbm.xml</value>
</list> -->
        </property>
        <property name="hibernateProperties">
         <props>
         <prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
         <!-- prop key="hibernate.transaction.factory_class">org.springframework.orm.hibernate.LocalTransactionManagerLookup</prop-->
         <!-- prop key="hibernate.connection.provider_class">com.strongit.finance.common.database.DatasourceConnectionProvider</prop-->
        <prop key="hibernate.query.substitutions">true 1,false 0</prop>
        <prop key="hibernate.session_factory_name">hibernate.sessionFactory</prop>
            <prop key="hibernate.dialect">org.hibernate.dialect.OracleDialect</prop>
            <prop key="hibernate.jdbc.use_streams_for_binary">true</prop>
            <prop key="hibernate.jdbc.fetch_size">50</prop>
            <prop key="hibernate.jdbc.batch_size">25</prop>
            <prop key="hibernate.max_fetch_depth">2</prop>
            <prop key="hibernate.show_sql">true</prop>
            <!--prop key="hibernate.hbm2ddl.auto">update</prop-->
         </props>
        </property>
        <!--  property name="jtaTransactionManager">
         <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
  <property name="targetObject"><ref local="transactionManager"/></property>
  <property name="targetMethod"><value>getTransactionManager</value></property>
</bean>
        </property-->
        <property name="jndiName">
         <value>jdbc/oracle</value>
        </property>
    </bean>    <!-- Transaction manager for a single Hibernate SessionFactory (alternative to JTA)  -->
    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory"><ref local="sessionFactory"/></property>
    </bean>
    
    <bean id="txProxyTemplate" abstract="true"
        class="org.springframework.aop.framework.ProxyFactoryBean">
        <property name="optimize">
         <value>true</value>
        </property>
        <property name="proxyTargetClass"><value>true</value></property>
        <property name="interceptorNames">
         <list>
         <value>daoMethodCacheInterceptor</value>
         <value>TransactionInterceptor</value>
         </list>
        </property>
    </bean>
        
    <bean id="TransactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
     <property name="transactionManager"><ref bean="transactionManager"/></property>
        <property name="transactionAttributes">
            <props>
                <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
                <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
                <prop key="*">PROPAGATION_REQUIRED</prop>
            </props>
        </property>    
    </bean>
    
    
    <bean id="daoMethodCacheInterceptor" class="com.danlong.common.interceptor.ThreadMethodCacheInterceptor">
    </bean>
    
    <bean id="hibernateMappingFileSetUtil" class="com.danlong.common.util.ListSetUtil">
     <property name="prefix">
     <value>hibernateMapping</value>
     </property>
    </bean>
    
    <bean id="daoTemplate" abstract="true" class="com.danlong.common.dao.BaseDAO">
     <property name="sessionFactory">
     <ref local="sessionFactory"/>
     </property>
     <property name="dataSource">
     <ref local="dataSource" />
   </property>
     <property name="cache">
     <ref local="methodCache" />
   </property>
    </bean> <bean id="common.baseDao" class="com.danlong.common.dao.BaseDAO" parent="daoTemplate"></bean>    <bean id="common.baseManager" parent="txProxyTemplate">
<property name="proxyInterfaces">
<list>
<value>com.danlong.common.service.Manager</value>
</list>
</property>
<property name="target">
<ref bean="com.danlong.common.service.imp.BaseManager"/>
</property>
</bean>
<bean id="com.danlong.common.service.imp.BaseManager" class="com.danlong.common.service.imp.BaseManager">
<property name="DAO">
<ref bean="common.baseDao"/>
</property>
</bean>


</beans>当我查询到对象发到jsp页面后,检索对象mang-to-one对象属性是就报could not initialize proxy - the owning Session was closed错误。不是mang-to-one属性没问题。

解决方案 »

  1.   

    session 打开方式是什么? openInView  还是 open后close
      

  2.   

    请问openInView怎么配置?我这样配置不行
      

  3.   

    我在配置文件中加了 <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
         <property name="beanNames">
             <value>*Manager</value>
            </property>
         <property name="interceptorNames">
             <list>
             <value>TransactionInterceptor</value>
             </list>
            </property>
        </bean>  
    也不起作用,不知道为什么
      

  4.   

    我已经把代理类配置到了action层,可以实现在action层延时加载了,配置文件是这样的: <bean name="/spot/spotManager" abstract="true">
    <property name="spotManager">
    <ref bean="spot.spotManager"/>
    </property>
    </bean>
    <bean name="/spotContentAction" class="com.danlong.spot.action.SpotContentAction" 
    singleton="false" parent="/spot/spotManager">
    </bean>

    <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
         <property name="beanNames">
         <list>
             <value>/spotContentAction</value>
             </list>
            </property>
         <property name="interceptorNames">
             <list>
             <value>TransactionInterceptor</value>
             </list>
            </property>
        </bean>   
    但是还是不能在jsp里面延迟加载数据,如果在action里面查询过对象,jsp里面就会有,否则还是报错。总的来说我的延迟加载配置是对的,现在的问题就是怎么实现延迟加载的拦截器控制到jsp层
      

  5.   

    以前我也发过这种帖子问过其他人 具体解决办法有很多OpenSessionInView这个我没实验过 不过据说不是很好 LZ可以尝试下或者在每次开启一个页面的时候在Filter同时开启一个事务 当离开的时候关闭这个事务 这样也是可以的再或者就是将延迟加载给去掉 lazy=falseLZ你想要延迟加载的数据是什么? 如果只是一条的话就没必要延迟加载了吧?
      

  6.   

    不是一条,是普遍啊,lazy=false不好啊,估计要考虑filter了
      

  7.   

    那就用filter吧 一般也是采用这种方式的 配置连接池应该就不用担心这个了 延迟加载少用为妙
      

  8.   

    问题解决了,谢谢大家,答案是在这里找到的
    http://finally-m.javaeye.com/blog/456925
    结贴了,回复的都有分哈,谢谢了