这个是hibernate的机制问题,它首先要查询除数据再更新。
解决方案 »
- ssh删除数据时报错
- html中用Ext写得一段代码错误 如下 解决好了分全给你
- 求救!! SpringMVC + DWR 怎么整合
- 参数的理解
- 使用JAVA如何 在JSP页面中如何自定义WEB控件(如text,button,radiobutton),求助!
- 紧急请教一个HttpSession处理的问题
- jdbc,jsp javabean,hibernate ejb j2ee ,java内容多,接下去该按什么次序学?
- spring中在ModelAndView对应的jsp页面中用OutputStream输出图像的问题
- 大家轻松一下:编程的进步!
- mbatis spring最近总是出现Connection is closed
- Spring配置问题
- 如何写axis java client进行ssl 和basic authtication?
另外直接新建一个含id值的对象,session.update(obj)也会出错。不知道new一个带id的对象和从session.load()取出对象再session关闭后的对象是否有区别。
只能像楼主说的这样,先把它取出来,再update才可以。高人出来理论一下吧!
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这个方法。
第一条查询sql是为了找出需要修改的记录的关键字(可能是个集合)
第二条查询sql是根据刚才查询出来的关键字来找出需要修改的记录的各个字段
不错,正如你所说的,加入已经知道了ID,完全可以直接update,我们以前的jdbc程序大多也是这么写的,可是这样做的话,无论要修改的值是否和以前数据库中存的值相同,都会做更新的,而hibernate允许dynamic-update的时候,只更新已经发生变化的字段,所有他才会"多此一举"的先查询.
所以完全是个假动作, 你不觉得这样比较符合逻辑吗?
取出 -> 修改 -> 存回