为什么我的hibernate查询语句,在查询结果出来之后还会去更新数据?

我在做一个产品分页查询,只从数据库找些数据出来,为什么找出来了之后它还会有一堆的update语句,而且更新语句:update product set name =? ... where id=?,这些更新的数据跟原来数据库里的一摸一样,为什么?我只是单纯的找数据,没道理分页查询出10条记录之后又跑出10条对应的update,它不是吃多了吗?缓存也不是这意思啊??!!
急,特请教各位大侠.帮帮忙,谢谢了1
我用的是ssh做的,用hibernateTemplate....方法做的
session每次都是新的。所以我认为不存在缓存的管理问题

不是吃饱了撑得,这个hibernate管理对象的生命周期的必然结果。假如你要从数据库查询产品 1>首先new个product对象(此时改对象为瞬态 没有纳入session管理) 2>从数据库查询获得product (此时product为持久态 即在数据库中有,内存中有 被session所管理。hibernate后台所执行的语句就是 select produc from ...)。3>查询完毕,你会提交事务,执行session.getTransation.commit;(其实这一步虽然你没显示的调用session.fush(),虚拟机也会自动调用,这样就是清理内存中的脏数据,将内存中的持久太对象保存到数据库 hibernate后台在这里执行了update product set name ...。product由持久太编程离线状态也成托管状态)。这里你的疑问就改明白了吧。实体对象的生命周期里,还有几种状态转换,自己好好看看吧。 hibernate这样设计自然是有他的好处--不用人工的进行脏数据检查,hibernate帮你做,免得疏忽大意导致对象没有持久化,有点类似于java虚拟机中的垃圾回收机制。
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-05-04
仔细检查方法的调用
第2个回答  2010-05-04
是不是你的查询方法里面有属性的setXXX()方法啊

为什么我的hibernate查询语句,在查询结果出来之后还会去更新数据?
不是吃饱了撑得,这个hibernate管理对象的生命周期的必然结果。假如你要从数据库查询产品 1>首先new个product对象(此时改对象为瞬态 没有纳入session管理) 2>从数据库查询获得product (此时product为持久态 即在数据库中有,内存中有 被session所管理。hibernate后台所执行的语句就是 select produc from ...

Hibernate保存方法为什么执行的却是更新?无论怎样都插不进数据,一直在...
因为你要保存的对象里面已经有了主键。所以调用 saveorupdate()的时候 有主键对象就会执行更新操作。如果你是用spring管理起来的 hibernate的话 建议你在类的上面加上 @scope("prototype") 这样应该就不会出现这样的问题。 如果不是用的spring 就手动的把主键设置成null ...

...之后,对它的某个属性set一个值,都没执行update语句,就自动更新...
hibernate有这个特性,你从数据库中查询到的对象因为还保持着跟数据库之间的连接,当你set属性的时候hibernate会自动将你set的数据保存到数据库,想要解决需要让这个对象和数据库之间的连接失效.

...之后,对它的某个属性set一个值,都没执行update语句,就自动更新...
hibernate有这个特性,你从数据库中查询到的对象因为还保持着跟数据库之间的连接,当你set属性的时候hibernate会自动将你set的数据保存到数据库,想要解决需要让这个对象和数据库之间的连接失效.

Hibernate 查询数据为何和数据库不一致?
hibernate自身的缓存问题,查询数据时hibernate将查询出的数据保存起来,当你的第二次查询语句与上次的一样,hibernate就不会去数据库中查询,而是直接把保存的数据拿出来用,所以就导致了查询结果与数据库不一致的问题。解决办法是不用缓存

关于hibernate的saveOrUpdate方法的一个问题
hibernate的一级缓存中,flush是清除缓存,将hibernate快照当中的数据一次性的提交的,hibernate在查询数据的时候,他只会从数据查询一次,然后将数据放到内存当中,当你在set属性时,hibernate会和内存中的做对比,如果只不一样的话,就修改其值, ession.flush清除缓存,清除缓存时就会提交事务~...

java通过id查询对象再set值会自动执行hibernate的update吗
对啊,你通过get(id)拿到的对象,就是持久化对象。你对持久化对象的任何更改,会在session.flush或者提交事务的时候更新到数据库。不过也要结合事务。如:开启事务。查询对象。改变对象。\/\/不需要显示的update。提交事务。就可以更新数据库。建议学习一下hibernate的瞬态,持久态,托管态。

hibernate中纯sql语句查询,当分页的时候会第二页以后会多出一列行号...
hibernate 分页查询的时候会将你的查询语句结果作为结果集然后在此之上查询 select * from (***) where rownum<30(←这是第一页每页三十个)select * from (select * from (***) where rownum<60 )where rownum_>30(←这是第二页每页三十个)所以多出来一列 具体解决方式... 我也不太清楚我...

用hibernate自动生成的attachDirty方法执行update为什么最后执行的是...
Hibernate的update和saveOrUpdate方法都是用于对跨Session的PO进行状态管理,它们的区别在于对PO采取何种策略。顾名思义,saveOrUpdate方法基本上就是合成了save和update方法,如果PO对象已经在session中持久化了,被改动后再在session中执行saveOrUpdate则会执行update方法(update);而如果PO对象是一个新创建的...

为什么在查询数据库得到结果是不能用LIST直接接受而是要用ResultSet...
除了基本的ResultSet用法,在查询语句满足一定条件的情况下ResultSet还可以直接更新数据库里的数据,而直接返回list是做不到的。所以可以看出返回ResultSet比list更加灵活,作为一个底层的方法灵活性是很重要的,如果不需要用到这么多的功能,程序员可以自己封装一层返回list也很简单,这也是java的优点啊 ...

相似回答