网上找过相关的文章,说只要dynamic-update="true"就会更新部分字段.从控制台看日志还是更新了全部的字段.而且以前的内容设置成null.具体是这么操作的,前台给我一个dto对象,我把dto转换成model(实体类).再调用hibernate进行更新.
User u = new User() ;
u.setId( dto.getId() ) ;
u.setName( dto.getName() ) ;
u.setAge( dto.getAge() ) ;this.getHibernateTemplate().update( u ) ;这样会更新全部.其他字段比如身高性别都会变成空值.
怎么让他更新部分字段啊?

解决方案 »

  1.   

    不要用this.getHibernateTemplate().update( u )
    用Query,自己写hql语句,比如"update Users u set u.age=20 where u.id=1"
    最后调用Query对象的executeUpdate()方法就ok了
      

  2.   

    写HQL语句可以修改,如果你乐意写Sql语句的话,hibernate也提供了这个方法。不过要修改数据的话,你应该先查找到对象,然后修改对象的属性值,然后再更新。而不是像你写的那样,直接创建一个新对象,再更新。
    User u=this.getHibernateTemplate().get(dto.getId() );
    u.setName( dto.getName() ) ;
    u.setAge( dto.getAge() ) ;
    this.getHibernateTemplate().update( u ) ;
      

  3.   

    这样确实可以更新,不过我这里30多个字段,每次更新都要检查一遍是不是效率太低了?有没有办法我改过哪个字段就让他更新哪个字段?拼sql感觉太麻烦了.
      

  4.   

    不要自己new 新的对象 要从数据库里取再改其中的属性然后在更新2楼说的 就是这个意思 你自己new在更新当然除了你自己设定的字段 其他字段都是空值 
      

  5.   

    3.0的话,可以直接写update语句,用query.executeUpdate();来实现 <!--  prop key="hibernate.query.factory_class">org.hibernate.hql.classic.ClassicQueryTranslatorFactory</prop>-->
    这个配置属性,可以不用配
      

  6.   

    三个方法
    1.根据转换过来的model类,通过id从数据库查出该记录,再通过set方法更改需要修改的字典,最后update对象
    2.前台缓存对象的所有属性,这样,传至后台的时候转换成model对象时,属性值就不会丢失了
    3.就像1楼说的,写sql语句更新特定的字段
      

  7.   

    暂时用了二楼的方法。
    试了一下直接用SQL更新也还好,至少一次数据库访问就完成操作了。不知道有没有什么潜在的问题。
    getHibernateTemplate().getSessionFactory().openSession().createSQLQuery("update table set xxx='123' where yyy='321'").executeUpdate();
    真是有点儿搞不懂hibernate。