错误原因:你用来更新的是离线对象
解决办法一:
先用get/load加载,再更新
解决办法二:
在映射文件里进行配置,标明哪些字段不更新

解决方案 »

  1.   

    你先将对象load上来在修改啊!不要new一个对象,在设置相应的属性,再保存。
      

  2.   

                  
    我这样子弄怎么没有用啊Session session = super.getSession();
    IaSysQuery iaSysQuery = (IaSysQuery)session.get(IaSysQuery.class, ciid);
    Ci ci = (Ci)session.get(Ci.class, ciid);
    session.saveOrUpdate(iaSysQuery);
    session.saveOrUpdate(ci);
      

  3.   


       已经解决了,谢谢名位热心的朋友们,原来有能用NEW一个新的对象。但是我不太明白为什么我这样做可以解决中文问题public void update(Long ciid,Long querytype, String createby, String displayname, String description){
      IaSysQuery iaSysQuery = (IaSysQuery)this.getHibernateTemplate().load(IaSysQuery.class, ciid);
    Ci ci = (Ci)this.getHibernateTemplate().load(Ci.class, ciid);
    iaSysQuery.setQuerytype(querytype);
    iaSysQuery.setCreateby(createby);
    ci.setDisplayname(displayname);
    ci.setDescription(description);
    getHibernateTemplate().saveOrUpdate(iaSysQuery);
    getHibernateTemplate().saveOrUpdate(ci);
      }  但是我这样做却有中文乱码问题这是为什么呢   public void updateIaSysQuery(Long querytype, String createby, Long ciid) {

            Session session = super.getSession();
            Query query = session.createQuery("update IaSysQuery set querytype=? , createby=? where ciid=?");
            query.setLong(0, querytype);
            query.setString(1, createby);
            query.setLong(2, ciid);
            query.executeUpdate();
            
    }

    public void updateCi(String displayname, String description, Long ciid) {
            Session session = super.getSession();
            Query query = session.createQuery("update Ci set displayname=? , description=? where id=?");
            query.setString(0, displayname);
            query.setString(1, description);
            query.setLong(2, ciid);
            query.executeUpdate();
    }
      

  4.   

    更新之前最好是把要更新的对象先查询出来
    再改变当前对象需要改变的属性的值
    而你那样更新当然数据会丢失
    那是因为你那个是个空对象
    这相当于A a = new A();
    a.setName("name");
    此时其他属性的值都为空
    所以你更新之后就是null