大家好,hibernate不是可以只更新部分数据,而其它的保留不变吗,我是这样做的,但是其它不需要更新的字段的数据却没有   类 Ci 它有五个属性 id, name, displayName,discription,createTime 原来都是有数据的,而我   Ci ci = new Ci();
   ci.setId(1); 
   ci.setDisplayName("报表");
   getHibernateTemplate().saveOrUpdate(ci);   数据表只有displayName字段的数据,而其它字段全都没了,是什么原因啊  

解决方案 »

  1.   

    不能用new Ci(),这样是添加了一条记录,只set了DisplayName的值,其他的当然为null了。
    更新的话应该先getHibernateTemplate().load(Ci.class,1),然后再set,最后再update
      

  2.   

    因为你虽然没有给其他几个属性赋值,但是在new的过程中,自动给他么赋了null值,你的后来给的id=1,和display=“报表”,实际上是2次赋值,所以你保存进去,null把以前的值给覆盖了,看到的就没有了
      

  3.   

      一楼的方法可行,谢谢了,边中文问题也解决了。但是我不太明白为什么我这样做可以解决中文问题
    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.   

    Hibernate就是这样,我刚学的时候也不太明白,现在看了大家的讲解,终于明白了! 呵呵呵!
      

  5.   

    hibernate操作是对象
    而对于修改数据来说,那是修改已存在对象的状态
    而你的操作:
    Ci ci = new Ci(); 
      ci.setId(1); 
      ci.setDisplayName("报表"); 
      getHibernateTemplate().saveOrUpdate(ci); 
    实际上调用的是save方法,只是这个save很特殊
    他相当于如下代码:
    A a = new A();
    假设A对象有很多属性
    而我们只调用了a对象的某个set方法
    所以其他属性的值是null
    而saveOrUpdate方法是如果没有就执行save
    有就执行update
    你这里是有
    只是所有属性都是null而已
    而你所设的id呢又恰好和数据库中的某个id相同
    所以执行了update方法
    其他值hibernate主动给你调用了set(null);
    所以就全部是null