是不是sf.setXX(codeVo) 然后再sf.codeIsUnique

解决方案 »

  1.   

    楼上说的我不是很明白
    codeVo = sf.getCodeByCodeID(opm, code_id);
    这个方法相当于我把要更新的VO从数据库中retrieve了出来
      

  2.   

    sf.codeIsUnique方法中执行了什么方法,能贴出来看看也许更好感觉:
    根据id retrieve 出来一个vo ,那这个vo在hibernate的cache中就有一个pojo对应,这时如果改变了这个pojo,那这个pojo在hibernate中hibernate已经会记下他应该与数据库同步(flush),如果这之后做了其它操作(不知到codeIsUnique方法),可能会有问题(看错误也许是这个问题)我其它不理解你为什么要先retrieve 再修改再用这个pojo去查
    其实在你的业务中,前面传来的数据直接用来判断重复才对啊,retrieve出来的那几个字段用来判断唯一有用码?
    所以,先new一个对象来判断,再retrieve,修改,update
    如果实在这样不行,就retrieve后再new一个对象(clone不知行不)来判断反正retrieve再修改后的pojo操作上是有很多限制的
      

  3.   

    把这个方法贴出来看看。。以前我也碰到类似的问题,关键是看你的返回值是个什么类型的,是null,还是?
    然后你判断到数据库里面执行的语句返回后的值是什么,如果为空,是null,还是?
    那么你判断的时候就要对应起来。
    不然就会有问题
    例如:  public int getInfosCount() throws Exception {
        int count = 0;
        String queryString = "select count(*) from Info";
        count = ((Integer) getHibernateTemplate().iterate(queryString).next()).
                intValue();
        return count;
      }是否有真的值出来
      

  4.   

    hibernate真的有太多的限制了,这个问题还没搞好,又有别的地方也冒出这样的问题了,这次我把完全的代码都贴出来,希望大家能帮我看看到底是哪出了问题:OPManager opm = new OPManager(false, log);
    try{
       HibernateUtil.beginTransaction();
       MdmCodeVO codeVo = (MdmCodeVO)opm.retrieveObj(MdmCodeVO.class, code_id);
       codeVo.setCodeEnname(code_enName);
       codeVo.getType().getId();
       codeVo.setCodeCnname(code_cnName);
       codeVo.setCodeTabname(code_tabName);
       codeVo.setOrderNum(Integer.valueOf(code_order == null || code_order.equals("") ? "0" : code_order));
       codeVo.setCodeRange(code_range);
       codeVo.setRefStand(code_standard);
       codeVo.setCatFund(code_fund);
       codeVo.setOtherInfo(code_info);
       codeVo.setCodingMeth(code_method);
       codeVo.setOtherInfo(code_info);   opm.updateObj(codeVo);
    } catch(Exception e){
       HibernateUtil.rollbackTransaction();
       log.error(e);
       request.setAttribute("CustomErr", "更新代码表时出错!");
       forward(request, response, WINDOWINIFRAME_ERROR_PAGE_URL);
    }
    错误信息依然是:
    15:35:33,422 [com.icss.mdm.maintain.structure.StructureUpdateServlet.performTask(StructureUpdateServlet.java:129)] - java.lang.Exception: 查询数据库出错...org.hibernate.AssertionFailure: collection was not processed by flush()
    java.lang.Exception: 查询数据库出错...org.hibernate.AssertionFailure: collection was not processed by flush()
    at com.icss.mdm.maintain.structure.StructureUpdateServlet.performTask(StructureUpdateServlet.java:115)
      

  5.   

    hibernate我没用过,但是看代码参照我用的turbine框架,觉得是不是HibernateUtil.beginTransaction();
    opm.updateObj(codeVo);
    之后还要
    HibernateUtil.TransactionCommitXX();-
    操作数据库时出错,检查数据库有没死锁。turbine例子
    TransactionBroker tb = new TransactionBroker(conn);      tb.begin();
    BOBean subBean = null
    subBean.setValue("status", "暂估");tb.saveBo(subBean);
    tb.commit();
    如果异常
    tb.rollBack();//希望能对楼主有所帮助