根据Session.setFlushMode(FlushMode),我们可以将FlushMode设置为会话。现在,我尝试通过一个小示例测试Flushmode.COMMIT模式的工作方式。
我创建了一个名为Cat
的实体,它只有2个属性id
和name
。现在这是我正在测试的代码:
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()
,则将覆盖该行为。