FlushMode.COMMIT如何工作

时间:2014-09-20 02:53:13

标签: java hibernate

根据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()发生了刷新。有人可以解释为什么会这样吗?

1 个答案:

答案 0 :(得分:1)

注意Session#flush()的Javadoc。

  

强制此会话刷新。必须在单位结束时调用   在提交事务和关闭会话之前工作   (取决于冲洗模式, Transaction.commit()会调用此方法)。

FlushMode#MANUAL

的javadoc
  

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

设置FlushMode只会定义flush()何时自动发生(除了MANUAL之外)。如果您自己拨打flush(),请手动覆盖该行为。