0

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

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

看来,只要我调用 bean setter,Hibernate 就必须发出数据库 UPDATE 调用。但这似乎不对?

安迪

4

2 回答 2

1

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

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

于 2012-10-22T15:20:07.643 回答
0

只需检查休眠的会话FlushMode。如果它是AlwaysAuto模式,则休眠将在执行新查询之前将脏数据刷新到数据库中。

FlushMode 的 java 文档

于 2012-10-22T15:10:46.913 回答