首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >未提交的hibernate刷新,使用手动刷新模式

未提交的hibernate刷新,使用手动刷新模式
EN

Stack Overflow用户
提问于 2013-06-29 17:32:33
回答 2查看 4.1K关注 0票数 0

我已经在googling上搜索了很多关于flush()、commit()以及hibernate圣经( Java Persistance with Hibernate)。

在我对这些方法是如何工作的理解中,似乎仍有一些不一致之处。

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

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

据我所知(根据hibernate圣经),在这种情况下,修改不会保存到数据库中,即使调用了flush()。这是正确的观察吗?

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

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

这到底是什么意思?这个术语在这里有点模糊,这个描述不能解释(更重要的是,自相矛盾!)上述观察结果。

请有人在这里明确说明同步这个词的含义,因为我在网上和hibernate圣经上都找不到这个问题的答案。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-29 17:49:23

以下应有所帮助:

据我所知(根据hibernate圣经),在这种情况下,修改不会保存到数据库中,即使调用了flush()。这是一个正确的观察吗?:是的,是的。

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

表示实体的状态与数据库的状态同步。

请有人在这里明确说明同步一词的含义,因为我在网上和hibernate圣经中都找不到这个问题的答案:

请考虑在对象与会话关联时更改对象的状态(通过更改该对象的任何属性)。现在,state对象与数据库的对象不一样(数据库表中的行)。在这里,当您调用刷新时,hibernate将生成一个更新查询,以更新具有此状态的数据库。

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

因此,使您困惑的同步部分只是确保数据库和实体是同步的。

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

票数 3
EN

Stack Overflow用户

发布于 2016-01-05 14:55:05

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17382901

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档