struts2+hibernate3+spring场景是这样,编辑用户的信息,User的属性有用户名,密码,所在城市id,昵称,简介,email,创建时间,更新时间,编辑的时候只想编辑所在城市id,昵称,简介,email,但我发现一更新所有字段都被更新了,由于用户名等属性我并没有在表单中用hidden域里保存,所以提交的时候,此属性就当成null被更新掉了,请问怎么指定要更新的具体字段,写hql固然可以,但感觉这样用不用hibernate都没什么区别了,如果在映射文件中指定字段的update为false,也不会适应于每种情况,比如说用户密码修改需要在一个单独的页面,这时是需要update的,但在编辑用户信息页面,又是不需要update的,书上也没有相应的解决方案,自己实际做点东西,发现问题很多。

解决方案 »

  1.   

    更新对象的时候,先通过主键find()一次,再set()表单中修改部分的数据.备注:find()是没有开销的,hibernate第一次读取数据的时候缓存在内存中,find()并没有访问数据库,所以你不用担心性能。
      

  2.   

    你可以用merge方法,但最好的方法还是写hql
      

  3.   


    用find其实不推荐了,应该用query.list,不过又要写hql,用get或load应该比较好吧,二者会去缓存里查,的确是没有什么性能损耗的。