hibernate:更改bean字段然后发出查询,查询看到更改的字段

时间:2012-10-22 14:15:35

标签: hibernate

我对会话中hibernate bean setter的行为感到困惑。我认为当你在会话中设置bean字段时,hibernate只知道bean是脏的,并且在会话关闭时,这是一个挂起的更新,它将被刷新到数据库。

但是,我在一个hibernate会话中运行了一个测试,我通过它的id获取了一个bean,将一个字段从true更改为false,然后对所有这些bean的列表进行了HQL查询,其中该字段为false。 "脏" bean在结果集中显示,好像hibernate在调用setter时已经使数据库UPDATE。然后我在离开会话之前做了一个session.clear(),取消挂起的更新并逐出所有bean。我认为这会有效地抛弃setter调用的脏变化。然而,我检查了数据库,记录了从true到false的变化。注意:从未在此会话中调用session.flush()。

一旦调用bean setter,Hibernate似乎必须发出数据库UPDATE调用。但这看起来不对吗?

安迪

2 个答案:

答案 0 :(得分:1)

没错,Hibernate在查询之前刷新任何挂起的更改(如果它确定挂起的更改可能会影响查询结果)。如果您不想保存对DB的任何更改,则必须回滚事务。如果您调用clear()但提交事务,它将保留在DB中,因为clear()被调用太晚(在SQL UPDATE之后)。或者按照kamlesh的建议更改刷新模式,但在选择特定的刷新模式时,请确保您知道自己在做什么。

PS:欢迎来到Hibernate世界。期待更多这样的惊喜。

答案 1 :(得分:0)

只需检查hibernate的会话FlushMode。 如果是始终自动模式,那么在执行新查询之前,hibernate会将脏数据刷新到数据库中。

java doc for FlushMode