3.3 操作session缓存

Hibernate提供个方法操作session缓存:

  • flush :使数据表中的记录和SESSION缓存中的对象的状态保持一致。为了保持一致,则可能会发送对应的SQL语句
  • refresh : 会强制发送SELECT语句,以使Session缓存中的数据与数据库中的数据一致
  • clear : 清空session缓存

3.3.1 flush方法

flush:Session按照缓存中对象的属性变化来同步更新数据库

  • 默认情况下Session在以下时间点刷新缓存
    • 显式调用 Session 的 flush() 方法
    • 当应用程序调用 Transaction 的 commit()方法的时, 该方法先 flush ,然后在向数据库提交事务
    • 当应用程序执行一些查询(HQL, Criteria)操作时,如果缓存中持久化对象的属性已经发生了变化,会先 flush 缓存,以保证查询结果能够反映持久化对象的最新状态
  • flush 缓存的例外情况: 如果对象使用 native 生成器生成 OID, 那么当调用 Session 的 save() 方法保存对象时, 会立即执行向数据库插入该实体的 insert 语句.
  • commit() 和 flush() 方法的区别:flush 执行一系列 sql 语句,但不提交事务;commit 方法先调用flush()方法,然后提交事务. 意味着提交事务意味着对数据库操作永久保存下来。

3.3.2 refresh方法

refresh : 强制发送SELECT语句,以使Session缓存中的数据与数据库中的数据一致 MySQL数据库可能会出现使用refresh方法,但是对象的状态不是最新(MySQL数据库默认事务隔离级别为可重复读:REPEATABLE READ,详见3.6),需要手动指定MySQL的事务隔离级别。

3.3.3 clear方法

clear :清空session缓存