【问题标题】:hibernate flush without commit, using manual flushmode休眠刷新而不提交,使用手动刷新模式
【发布时间】:2013-06-29 17:32:33
【问题描述】:

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

我对这些方法的工作原理的理解似乎仍然有些不一致。

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

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

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

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

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

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

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

【问题讨论】:

    标签: hibernate commit flush


    【解决方案1】:

    以下内容应该有所帮助:

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

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

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

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

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

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

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

    其实调用commit()的时候,默认是隐式调用flush()的。

    【讨论】:

      【解决方案2】:

      是的,当我们在 session 上调用 flush() 方法时,对象的变化与 数据库相关实体,但不会更新到数据库。当我们调用 Commit() 时,它将被更新。

      【讨论】:

        猜你喜欢
        • 2011-07-28
        • 2021-09-15
        • 1970-01-01
        • 1970-01-01
        • 2020-06-25
        • 1970-01-01
        • 2017-03-28
        • 1970-01-01
        • 2012-12-23
        相关资源
        最近更新 更多