Hibernate 中,flushclear 是两个与 一级缓存(Session 缓存) 管理密切相关的方法,属于 Session 接口的重要操作。它们分别用于同步清空持久化上下文。

一、flush() 是什么?

flush() 的作用是:

Hibernate Session 缓存中的数据同步到数据库,但不提交事务

举例:

你调用了 session.save(entity),此时数据只是保存在 Hibernate 的内存中,并没有立即写入数据库。调用 flush() 后,Hibernate 会生成相应的 SQL 语句(如 INSERTUPDATEDELETE)并发送给数据库执行。

何时使用 flush?

  1. 需要提前执行 SQL:比如在事务提交前你需要确保数据库已经更新(如为了后续的 SQL 查询能查到最新数据)。
  2. 执行原生 SQL 之前:Hibernate 不会自动 flush,所以如果你用原生 SQL 查询涉及刚刚修改过的数据,需要手动 flush。
  3. 批量更新场景中定期 flush 减少内存压力

二、clear() 是什么?

clear() 的作用是:

清空当前 Session 的一级缓存(即持久化上下文),所有被缓存的对象变为游离状态(Detached)

举例:

调用 clear() 后,Hibernate 不再跟踪 Session 中的所有实体对象。如果你修改这些对象的属性,Hibernate 不会再自动感知到变化,也不会自动同步到数据库。

何时使用 clear?

  1. 批量处理大数据量时:防止内存占用过高,比如每处理 100 条记录就 flush() 一次并 clear() 一次。
  2. 避免缓存污染:某些场景下你可能不希望旧对象影响新事务。

三、结合使用的典型场景(伪代码):

for (int i = 0; i < entities.size(); i++) {
    session.save(entities.get(i));
    if (i % 50 == 0) {
        session.flush(); // 写入数据库
        session.clear(); // 清空缓存,防止内存占用过高
    }
}

总结:

方法作用使用场景
flush()将缓存同步到数据库,不提交事务数据需要及时入库、执行原生 SQL 前、控制 SQL 执行顺序
clear()清空 Session 缓存,断开对象与 Session 的关联批处理优化内存、避免旧对象干扰