这个是hibernate的机制问题,它首先要查询除数据再更新。

解决方案 »

  1.   

    是什么机制?为什么要这样呢?既然我知道了ID,为什么不能直接update呢?
      

  2.   

    我也有这样的问题,hibernate的specification中说对象在detatch状态时可以用session.update()或session.saveOrUpdate()将对象持久化,但我将一个对象(obj) 在session.load之后在放appllicaton作用域,但当我某个时候取出此对象,修改后再session.update(obj)时会出错。
    另外直接新建一个含id值的对象,session.update(obj)也会出错。不知道new一个带id的对象和从session.load()取出对象再session关闭后的对象是否有区别。
    只能像楼主说的这样,先把它取出来,再update才可以。高人出来理论一下吧!
      

  3.   

    to:dongshaojie (董少杰) 
    JdvUser user = (JdvUser)ses.load(JdvUser.class,userId);    
    这一句是将user的状态设置为持久状态,这时user中的属性都是有值的,也就是说,这里就是select
    user.setUserName(userName);    
    user.setSex(sex);    
    ses.flush();    
    这一句是update。
    关于update出错的情况,我想大概是id的生成机制问题,也就是equal的时候认id出错了,在持久状态下是通过equal来判断需不需要update的,如果这里错了,有可能就会发生这个问题,你看看你的equal这个方法。
      

  4.   

    我很同意 miaoliujun(傲龙) 的观点。
      

  5.   

    to:miaoliujun(傲龙)我明白这些语句的作用,不过我明白的是我只是要进行UPDATE,为什么要先取得PO呢?我已经知道ID了,如果是直接操作JDBC相信没人会先把这条记录SELECT回来,再UPDATE吧。
      

  6.   

    to:少杰
    第一条查询sql是为了找出需要修改的记录的关键字(可能是个集合)
    第二条查询sql是根据刚才查询出来的关键字来找出需要修改的记录的各个字段
    不错,正如你所说的,加入已经知道了ID,完全可以直接update,我们以前的jdbc程序大多也是这么写的,可是这样做的话,无论要修改的值是否和以前数据库中存的值相同,都会做更新的,而hibernate允许dynamic-update的时候,只更新已经发生变化的字段,所有他才会"多此一举"的先查询.
      

  7.   

    没什么问题啊,  Hibernate的惰性载入机制, load(id)的时候, 并没有去查数据库.
    所以完全是个假动作, 你不觉得这样比较符合逻辑吗?
    取出 ->  修改 -> 存回