我已经在googling上搜索了很多关于flush()、commit()以及hibernate圣经( Java Persistance with Hibernate)。
在我对这些方法是如何工作的理解中,似乎仍有一些不一致之处。
这里有一个有点令人费解的观察:
让我们假设我们使用手动刷新模式。我们启动一个新会话,启动一个事务,加载和修改一些持久对象,然后刷新和关闭会话,但是在此过程中我们不会对事务执行commit方法。
据我所知(根据hibernate圣经),在这种情况下,修改不会保存到数据库中,即使调用了flush()。这是正确的观察吗?
以下是另一个相关的问题,hibernate javadoc说:
刷新是将底层持久存储与内存中的持久化状态同步的过程。
这到底是什么意思?这个术语在这里有点模糊,这个描述不能解释(更重要的是,自相矛盾!)上述观察结果。
请有人在这里明确说明同步这个词的含义,因为我在网上和hibernate圣经上都找不到这个问题的答案。
发布于 2013-06-29 17:49:23
以下应有所帮助:
据我所知(根据hibernate圣经),在这种情况下,修改不会保存到数据库中,即使调用了flush()。这是一个正确的观察吗?:是的,是的。。
刷新是将底层持久存储与内存中的持久化状态同步的过程。
表示实体的状态与数据库的状态同步。。
请有人在这里明确说明同步一词的含义,因为我在网上和hibernate圣经中都找不到这个问题的答案:
请考虑在对象与会话关联时更改对象的状态(通过更改该对象的任何属性)。现在,state对象与数据库的对象不一样(数据库表中的行)。在这里,当您调用刷新时,hibernate将生成一个更新查询,以更新具有此状态的数据库。
但是update操作是否已提交?不,您需要发出commit,以确保此更新实际上反映在DB中。
因此,使您困惑的同步部分只是确保数据库和实体是同步的。
实际上,当您调用commit()时,默认情况下它隐式地调用刷新()。
https://stackoverflow.com/questions/17382901
复制相似问题