0

我在谷歌上搜索了很多关于 flush()、commit() 的内容,并且我已经阅读了休眠圣经(Java Persistance with Hibernate)。

我对这些方法如何工作的理解似乎仍然存在一些不一致之处。

这是一个有点令人费解的观察:

让我们假设我们使用手动刷新模式。我们开始一个新的会话,启动一个事务,加载和修改一些持久对象,然后刷新和关闭会话但是在这个过程中我们没有对事务执行提交方法。

据我了解(来自休眠圣经),在这种情况下,即使调用了 flush() ,修改也不会保存到数据库中。这是一个正确的观察吗?

这是另一个相关的问题,hibernate javadoc说:

刷新是将底层持久存储与内存中保存的持久状态同步的过程。

这究竟是什么意思?术语同步在这里有点模糊,这个描述没有解释(还有,矛盾!)上面提到的观察。

有人可以在这里准确澄清同步这个词的含义,因为我在网上和休眠圣经中都找不到这个问题的答案。

4

2 回答 2

3

下面应该有帮助:

据我了解(来自休眠圣经),在这种情况下,即使调用了 flush(),修改也不会保存到数据库中。这是一个正确的观察吗?:是的,它是正确的。

刷新是将底层持久存储与内存中保存的持久状态同步的过程。

这意味着实体的状态与数据库的状态同步。

有人可以在这里准确澄清同步这个词的含义,因为我在网上和休眠圣经中都找不到这个问题的答案:

考虑在该对象与会话关联时更改对象的状态(通过更改该对象的任何属性)。现在状态对象对象与数据库的对象不同(数据库表中的行)。在这里,当你调用flush时,hibernate会生成一个更新查询,用这个状态更新数据库。

但是更新操作是否已提交?不,您需要发出提交以确保此更新实际上反映在 DB 中。

因此,让您感到困惑的同步部分只不过是确保数据库和您的实体是同步的。

实际上,当您调用 commit() 时,默认情况下它会隐式调用 flush()。

于 2013-06-29T17:49:23.630 回答
0

是的,当我们在 session 上调用 flush() 方法时,对象的更改会与 DB 相关实体同步,但不会更新到 DB。当我们调用 Commit() 时,它将被更新。

于 2016-01-05T14:55:05.887 回答