根据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()
发生了刷新。有人可以解释为什么会这样吗?
答案 0 :(得分:1)
注意Session#flush()
的Javadoc。
强制此会话刷新。必须在单位结束时调用 在提交事务和关闭会话之前工作 (取决于冲洗模式,
Transaction.commit()
会调用此方法)。
或FlushMode#MANUAL
Session
只有在明确Session.flush()
时才会被刷新 由应用程序调用。此模式对于只读非常有效 交易。
设置FlushMode
只会定义flush()
何时自动发生(除了MANUAL
之外)。如果您自己拨打flush()
,请手动覆盖该行为。