出现这种问题主要是因为hibernate的Session已经关闭,造成你的修改操作是在没有事务的环境下提交的,所以就会报这种错

解决方案 »

  1.   

    http://blog.csdn.net/lwj3025/archive/2007/11/16/1887645.aspx
    不知能不能帮到你,顶一下
      

  2.   

    谢谢,但是还是没有办法解决,我刚看了http://blog.csdn.net/lwj3025/archive/2007/11/16/1887645.aspx 上面的帖子,同样照那样做下来,只是数据库改为mysql,同样是报同样的错误,先给20分,希望继续帮小弟弟讲解讲解哦
      

  3.   

    umbrella_yxs 
    你好,说详细些嘛,我的配置在上面都写好了的,你看那里出了问题
      

  4.   

    就是说上传文件的保存。这个方法要是一个事务。我举个例子:
    public void saveObject(File imgFile){

    TbCommodity commodity = new TbCommodity();
    try {
    byte[] commodityImg = org.springframework.util.FileCopyUtils.copyToByteArray(imgFile);
    commodity.setCommodityImg(commodityImg);
    } catch (IOException e) {
    System.out.println("二进制数组未转化成功......");
    }

    commodityDAO.save(commodity);

    }
    而这个saveObject方法,是要为一个事务才可以。
      

  5.   

    首先谢谢楼上大哥的帮忙,因为我是小弟,所以很多不明白,我现在把我的代码贴出来,让您看看,还有你这里是在保存方法中用org.springframework.util.FileCopyUtils.copyToByteArray这个来转化为二进制数据,我是用的动态form,所以直接使用
     DynaActionForm df = (DynaActionForm)form;
    (FormFile)df.getstring("前台文件上传标签name").getFileData()
    这样来直接转化为二进制数据的.为什么你这里要这样来转化呢?
      DAO中的保存文件代码为:
              public boolean declareProject(Project project) {
    try{
    this.getHibernateTemplate().save(project);
    return true;
    }catch(DataAccessException e){
    throw e;
    }
    }

       PO中的相应属性类型为:byte[],xml中的类型为:org.springframework.orm.hibernate3.support.BlobByteArrayType
       ApplicationContent.xml中的配置代码为:
           <bean id="lobHandler"     class="org.springframework.jdbc.support.lob.DefaultLobHandler" lazy-init="default"/>
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="lobHandler"  ref="lobHandler"/>
    <property name="hibernateProperties">
    <props>
    <prop key="hibernate.dialect">${hibernate.dialect}</prop>
    <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
    </props>
    </property>
    <property name="mappingResources">
    <list>
        <value>***.hbm.xml</value>
           </list>
    </property>
    </bean>
    <bean id="transactionManager"
      class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory">
        <ref local="sessionFactory"/>
    </property>
        </bean>
        <bean id="projectDAOProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
         <property name="transactionManager">
       <ref local="transactionManager"/>
     </property>
     <property name="target">
        <ref local="projectDAO"/>
     </property>
         <property name="transactionAttributes">
       <props>
        <prop key="create*">PROPAGATION_REQUIRED</prop>
        <prop key="edit*">PROPAGATION_REQUIRED</prop>
        <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
        <prop key="delete*">PROPAGATION_REQUIRED</prop>
        <prop key="save*">PROPAGATION_REQUIRED</prop>
       </props>
     </property>
     </bean>
     <bean id="projectDAO"
           class="com.PMS.DaoImp.ProjectDaoI"
           singleton="true">
      <property name="sessionFactory">
         <ref local="sessionFactory"/>
      </property>
     </bean>
     <bean id="projectServices"
           class="com.PMS.ServicesImp.ProjectServicesI"
           singleton="true">
     <property name="projectDao">
        <ref local="projectDAO"/>
     </property>
     </bean>
    还有的就没有贴出来了大哥,希望帮帮小弟,小弟已经搞了几天了
      

  6.   

    我用struts2,所以传上来的是File类型。
    你的(FormFile)df.getstring("前台文件上传标签name").getFileData()不会报错吗?
    还有你的service并没有用事务管理。spring1.x的事务配置:<bean   id="projectDAOProxy"   class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true"
    ......
    </bean>
    <bean   id="projectServicesTarget" 
                  class="com.PMS.ServicesImp.ProjectServicesI" 
                  singleton="true"> 
      <property   name="projectDao"> 
            <ref   local="projectDAO"/> 
      </property> 
      </bean>
    <bean id="projectServices" parent="projectDAOProxy">
    <property name="target">
    <ref local="dictServiceTarget"/>
    </property>
    </bean>这样你的projectServices中的save*就是一个事务,你的copyToByteArray应该在这个是事务里执行。
      

  7.   

    mysql 是不是不支持事务啊
      

  8.   

    umbrella_yxs 大哥,你真好!!!!!
    但是我还是有些不明白,为什么你会这样说呢"这样你的projectServices中的save*就是一个事务,你的copyToByteArray应该在这个是事务里执行"
    我把我的原因帖出来,希望大哥您能多多指点,  DynaActionForm   df   =   (DynaActionForm)form; 
      (FormFile)df.getstring("前台文件上传标签name").getFileData();这样可以实现将上传的文件转化为二进制文件,我测试通过了的./**
    <bean   id="lobHandler"       class="org.springframework.jdbc.support.lob.DefaultLobHandler"   lazy-init="default"/> <!--spring 对hibernate的封装,完成了hibernate中的hibernate.cfg.xml 文件所需要的基础申明,并按照工作方式将这些配置申明注入org.springframework.orm.hibernate.LocalSessionFactoryBean中   --><bean   id="sessionFactory"   class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
    <property   name="dataSource"   ref="dataSource"/> 
    <property   name="lobHandler"     ref="lobHandler"/> 
    <property   name="hibernateProperties"> 
    <props> 
    <prop   key="hibernate.dialect"> ${hibernate.dialect} </prop> 
    <prop   key="hibernate.show_sql"> ${hibernate.show_sql} </prop> 
    </props> 
    </property> 
    <property   name="mappingResources"> 
    <list> <value> ***.hbm.xml </value></list> 
    </property> 
    </bean> 
    <!--事务管理进行声明-->
    <bean   id="transactionManager" 
        class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
    <property   name="sessionFactory"> 
            <ref   local="sessionFactory"/> 
    </property> 
    </bean> <!--spring 对事务管理的支持,利用AOP为projectDAO注入事务处理的工作-->
    <bean   id="projectDAOProxy"   class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> 
              <property   name="transactionManager"> 
          <ref   local="transactionManager"/> 
      </property> 
      <property   name="target"> 
            <ref   local="projectDAO"/> 
      </property> 
              <property   name="transactionAttributes"> 
          <props> 
            <prop   key="create*"> PROPAGATION_REQUIRED </prop> 
            <prop   key="edit*"> PROPAGATION_REQUIRED </prop> 
            <prop   key="find*"> PROPAGATION_REQUIRED,readOnly </prop> 
            <prop   key="delete*"> PROPAGATION_REQUIRED </prop> 
            <prop   key="save*"> PROPAGATION_REQUIRED </prop> 
          </props> 
      </property> 
      </bean> 
    <!--对DAO创建进行管理,并注入SessionFactory,为DAO的实现类提供服务-->
      <bean   id="projectDAO" 
                  class="com.PMS.DaoImp.ProjectDaoI" 
                  singleton="true"> 
        <property   name="sessionFactory"> 
              <ref   local="sessionFactory"/> 
        </property> 
      </bean> <--对业务逻辑的创建进行了管理,依赖注入了实现的DAO-->
      <bean   id="projectServices" 
                  class="com.PMS.ServicesImp.ProjectServicesI" 
                  singleton="true"> 
      <property   name="projectDao"> 
            <ref   local="projectDAO"/> 
      </property> 
      </bean> 根据我的注释来分析,其中的上传文件方法在projectServices接口的实现类com.PMS.ServicesImp.ProjectServicesI中,为什么说没有处于事务范围呢?
    大哥请您多多指点哦?小弟需要您的指点,我是初学者哦,谢谢,待我在您的帮助下解决后高分相送.
      

  9.   

    你的mysql版本应该是支持事务吧?!
    因为你的service没有配置事务管理啊[color=#FF0000<property   name="target"> 
            <ref   local="projectDAO"/> 
      </property> [/color]改成<property   name="target"> 
            <ref   local="projectServices"/> 
      </property>试下……
      

  10.   

    mysql 是支持事务的
    因为前面很多事务都是执行的,就是这里的文件上传有问题
    大哥,我这里按照你那样修改了还是有问题的,哎!