spring2.5声明式事务及OpenSessionInView的问题——请教高手项目中想用到LazyLoad,就添加了OpenSessionInView在web.xml中配置
    <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>
启动正常,程序运行,报有:
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.biconcept.job.moduls.Registerinfo.personregiinfos, no session or session was closed
org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:358)
org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:350)
org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:343)
org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:86)
org.hibernate.collection.PersistentSet.toArray(PersistentSet.java:171)
com.biconcept.job.action.person.ResumeManaAction.findResume(ResumeManaAction.java:439)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
是没有添加声明式事务管理的原因,于是在applicationContext.xml中添加声明式事务:
<!--配置声明式事务管理-->
<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
   <property name="sessionFactory" ref="sessionFactory" />
</bean>
   <tx:advice id="txAdvice" transaction-manager="txManager">
         <tx:attributes>
       <tx:method name="find*" propagation="REQUIRED" read-only="true" rollback-for="Exception" />   
       <tx:method name="insert*" propagation="REQUIRED" read-only="false"/>   
         </tx:attributes>
   </tx:advice>   
  <aop:config proxy-target-class="true">
  <aop:pointcut id="interceptorPointCuts"
                       expression="execution(* com.biconcept.job.biz.impl.LogBizImpl.*(..))" />
                  <aop:advisor advice-ref="txAdvice"
                       pointcut-ref="interceptorPointCuts" />
</aop:config>
启动正常,运行时却报有:
java.lang.reflect.InvocationTargetException
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
java.lang.reflect.Method.invoke(Unknown Source)
com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:440)
com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:279)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:242)
com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:163)
com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:249)
org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68)

com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:176)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52)
org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:468)
org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:395)
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
root cause java.lang.NoSuchMethodError: org.springframework.orm.hibernate3.HibernateTransactionManager.determineTimeout(Lorg/springframework/transaction/TransactionDefinition;)I
org.springframework.orm.hibernate3.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:499)
org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:293)
org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:226)
org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:89)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:635)
com.biconcept.job.biz.impl.LogBizImpl$$EnhancerByCGLIB$$3a93df7f.insertRegister(<generated>)
com.biconcept.job.action.LogAction.inRegister(LogAction.java:116)
com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:176)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52)
org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:468)
org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:395)
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)环境说明:tomcat6.0.2+MyEclipse7.0+struts2.1.6+Spring2.5+Hibernate3.2
Spring和Hibernate是添加MyEcllipse自带的,struts是手动添加的。涉及的jar主要有
spring-orm.jar(2008-4-28),删了spring.jar和spring-hibernate3.jar也是一样的错误
把OpenSessionInView和声明式事务的配置注释掉,程序运行正常
弄了两天没弄出来
特来请教高手!权力限制,只能给100分,敬请见谅!
谢谢!

解决方案 »

  1.   

    <filter>
    <filter-name>openSession</filter-name>
    <filter-class>
    org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
    </filter-class>
    <init-param>
    <param-name>flushMode</param-name>
    <param-value>AUTO</param-value>
    </init-param>
    </filter>
    <filter-mapping>
    <filter-name>openSession</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>
    试试这个删包只需要删掉冲突的那几个就好了
      

  2.   

    failed to lazily initialize a collection of role: com.biconcept.job.moduls.Registerinfo.personregiinfos, no session or session was closed 在web.xml里面把filter OpenSessionInView放到最上面看看,有时候会和struts2的拦截器冲突的
      

  3.   

    OpenSessionInView配置部分少了点
    应该为
    <!-- opern session inView -->
        <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>
      

  4.   


    改成这样的配置了,并把声明式事务注释掉,但还是一样的错误
    org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.biconcept.job.moduls.Registerinfo.personregiinfos, no session or session was closed
    org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:358)
    org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:350)
    org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:343)
      

  5.   


    是的,已经是在<filter>
            <filter-name>struts2</filter-name>  
            <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>  
        </filter>前面的了
      

  6.   

    Thank you all the same!
      

  7.   


    RegisterinfoDAOImpl.java public void save(Registerinfo transientInstance) {
    log.debug("saving Registerinfo instance");
    try {
    getHibernateTemplate().save(transientInstance);
    log.debug("save successful");
    } catch (RuntimeException re) {
    log.error("save failed", re);
    throw re;
    }
    }LogBizImpl.java public boolean insertRegister(Map registerInfo) throws IsExistingException{

    try { //提取注册信息
    Email oneEmail = (Email) registerInfo
    .get(LogAction.REGISTERINFO_KEY_EMAIL);
    Registerinfo oneRegister = (Registerinfo) registerInfo
    .get(LogAction.REGISTERINFO_KEY_REGISTERINFO);
    Personregiinfo onePersonregiinfo = (Personregiinfo) registerInfo
    .get(LogAction.REGISTERINFO_KEY_PERSONREGIINFO);

    //检验登录名
    if(isExistingLogName(oneRegister.getReinLogname())){
    throw new IsExistingException(State.ISEXISTINGLOGNAME);
    }

    //检验邮箱
    if(getEmailBiz().isExistingEmail(oneEmail)){
    throw new IsExistingException(State.ISEXISTINGEMAIL);
    }

    getEmailBiz().save(oneEmail);
    getLogDAO().save(oneRegister);
    onePersonregiinfo.setEmail(oneEmail);
    onePersonregiinfo.setRegisterinfo(oneRegister);
    getPersonregiinfoDAO().saveOrUpdate(onePersonregiinfo); } catch (Exception e) {
    return false;
    }
    return true;
    }
    LogAction.java
    public String inRegister() {
    Map registerInfo = new HashMap(); Registerinfo oneRegister = new Registerinfo();
    Personregiinfo onePersonregiinfo = new Personregiinfo();
    Email oneEmail = new Email();
    oneRegister.setReinLogname(getLogname());
    oneRegister.setReinPassword(getPassword());
    oneRegister.setReinRegitime(new Date());
    String emailStr = getValiemail();
    oneEmail.setEmlName(emailStr.substring(0, emailStr.indexOf("@")));
    oneEmail.setEmlDomainname(emailStr.substring(emailStr.indexOf("@") + 1));
    registerInfo.put(LogAction.REGISTERINFO_KEY_EMAIL, oneEmail);
    registerInfo.put(LogAction.REGISTERINFO_KEY_REGISTERINFO, oneRegister);
    registerInfo.put(LogAction.REGISTERINFO_KEY_PERSONREGIINFO,
    onePersonregiinfo); try {
    logBiz.insertRegister(registerInfo);
    } catch (IsExistingException e) {
    }
    return SUCCESS;
    }
      

  8.   

    你写的声明式事务有问题:这样写你试试
    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory"/>
    </bean>
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <!-- 根据实际需要对指定方法进行事务参数的指定 -->
    <tx:method name="*" isolation="READ_COMMITTED"/>
    <tx:method name="find*" read-only="true"/>
    </tx:attributes>
    </tx:advice>
    <aop:config>
    <aop:advisor advice-ref="txAdvice" pointcut="execution(* com.liuc.service.impl.*.*(..))"/>
    </aop:config>

    <!-- 这里添加业务逻辑类的配置 -->
      

  9.   

    liuc0317,谢谢!根据具体情况作了如下修改:
    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="sessionFactory"/> 
    </bean>
    <tx:advice id="txAdvice" transaction-manager="transactionManager"> 
    <tx:attributes> 
         <!-- 根据实际需要对指定方法进行事务参数的指定 --> 
    <tx:method name="insert*" isolation="READ_COMMITTED"/> 
    <tx:method name="find*" read-only="true"/> 
    </tx:attributes> 
    </tx:advice> 
    <aop:config> 
    <aop:advisor advice-ref="txAdvice" pointcut="execution(* com.biconcept.job.biz.impl.*.*(..))"/> 
    </aop:config>
    修改得应该没错,但是很遗憾,还是不能解决问题。
      

  10.   

    我重新部署之前都先把原先的删除了,不会是tomcat引用旧项目的原因。小弟是菜鸟,对aop,声明事务,缓存(尤其是现在亟需解决的二级缓存问题)等的原理甚至是应用,都只是刚入门,只能是一边做项目,遇到问题就上网搜搜,copy前辈的代码,根据自己的情况做修改。所以对问题总不能很好地解决。急切盼望各位前辈DX给予指导,不胜感激!
      

  11.   

    <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="insert*" propagation="REQUIRED"/>    
            <tx:method name="*" read-only="true"/>   
        </tx:attributes>   
    </tx:advice>   
       
    <!-- 那些类的哪些方法参与事务 -->   
    <aop:config>   
        <aop:pointcut id="allManagerMethod" expression="execution(* com.ssh.service..*(..))"/>   
        <aop:advisor pointcut-ref="allManagerMethod" advice-ref="txAdvice"/>   
    </aop:config>   
      

  12.   


    很可惜,还是没成功。
    估计还是jar包方面的原因
      

  13.   

    asm  cglib  看看重了没有。重了就去掉