我一直在谷歌搜索关于flush(),commit()的很多东西,我已经阅读了hibernate圣经(Java Persistance with Hibernate)。
我对这些方法如何运作的理解似乎仍有些不一致。
这是一个有点令人费解的观察结果:
让我们假设我们使用手动flushmode。 我们启动一个新会话,启动一个事务,加载和修改一些持久对象,然后刷新并关闭会话但是我们在此过程中不对事务执行commit方法。
据我所知(来自hibernate圣经),在这种情况下,即使调用flush(),修改也 保存到数据库中。这是正确的观察吗?
以下是另一个相关问题,hibernate javadoc说:
刷新是将底层持久存储与内存中保持的持久状态同步的过程。
这究竟是什么意思?这里的同步这个术语有点模糊,这个描述并没有解释上述观察结果(更多,相矛盾!)。
有人可以在这里准确地澄清同步一词的含义,因为我无法在网上或冬眠圣经中找到这个问题的答案。
答案 0 :(得分:3)
下面应该有所帮助:
据我所知(来自hibernate圣经),在这种情况下,即使调用flush(),修改也不会保存到数据库中。这是正确的观察吗? :是的,这是正确的。
刷新是将底层持久存储与内存中保持的持久状态同步的过程。
表示实体的状态与数据库的状态同步。
有人可以在这里准确地澄清同步这个词的含义,因为我无法在网上或冬眠圣经中找到这个问题的答案:
当该对象与会话关联时,请考虑更改对象的状态(通过更改该对象的任何属性)。现在状态对象的对象与数据库的对象(数据库表中的行)不同。在这里,当您调用flush时,hibernate会生成更新查询,以使用此状态更新数据库。
但是提交了更新操作吗?不,您需要发出提交以确保此更新实际上反映在数据库中。
因此,令您困惑的同步部分只是确保数据库和您的实体同步。
实际上,当你调用commit()时,默认情况下会隐式调用flush()。
答案 1 :(得分:0)
是的,当我们在会话上调用flush()方法时,对象的更改与之同步 数据库相关实体,但它不会更新到数据库。当我们调用Commit()时它会更新。