根据Session.setFlushMode(FlushMode),我们可以将FlushMode设置为会话。现在,我尝试通过一个小示例测试Flushmode.COMMIT模式的工作方式。

我创建了一个名为Cat的实体,它只有2个属性idname。现在这是我正在测试的代码:

    Session session = getSession();
    session.setFlushMode(FlushMode.COMMIT);
    Transaction tx = session.beginTransaction();
    Cat cat = (Cat) session.get(Cat.class, 1);
    cat.setName(name);
    session.flush();
    //tx.commit();
    session.close();


从日志中我可以看到,当执行session.flush()行时,hibernate将对数据库的JDBC更新调用发布为:

Hibernate: update Cat set name=? where id=?


当我将FlushMode设置为COMMIT时,我期望仅当我说update时才会执行tx.commit()查询,但是刷新发生在session.flush()上。有人可以解释为什么会这样吗?

最佳答案

注意Session#flush()的Javadoc。


强制刷新该会话。必须在一个单元的末尾调用
工作,提交事务并关闭会话之前
(取决于刷新模式,Transaction.commit()调用此方法)。


FlushMode#MANUAL的javadoc


仅当明确地Session时才刷新Session.flush()
由应用程序调用。此模式对于只读非常有效
交易。


设置FlushMode只是定义了flush()何时会自动发生(除MANUAL以外的所有内容)。如果您自己手动调用flush(),则将覆盖该行为。

07-24 14:01