我对会话中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调用。但这看起来不对吗?
安迪
答案 0 :(得分:1)
没错,Hibernate在查询之前刷新任何挂起的更改(如果它确定挂起的更改可能会影响查询结果)。如果您不想保存对DB的任何更改,则必须回滚事务。如果您调用clear()
但提交事务,它将保留在DB中,因为clear()
被调用太晚(在SQL UPDATE之后)。或者按照kamlesh的建议更改刷新模式,但在选择特定的刷新模式时,请确保您知道自己在做什么。
答案 1 :(得分:0)
只需检查hibernate的会话FlushMode。 如果是始终或自动模式,那么在执行新查询之前,hibernate会将脏数据刷新到数据库中。