1. Session 概述
•Session 接口是 Hibernate 向应用程序提供的操纵数据库的最主要的接口,
它提供了基本的保存, 更新, 删除和加载 Java 对象的方法.
•Session 具有一个缓存, 位于缓存中的对象称为持久化对象, 它和数据库中
的相关记录对应. Session 能够在某些时间点, 按照缓存中
对象的变化来执行相关的 SQL 语句, 来同步更新数据库,
这一过程被称为刷新缓存(flush)
•站在持久化的角度, Hibernate 把对象分为 4 种状态: 持久化状态, 临时状态,
游离状态, 删除状态. Session 的特定方法能使对象从一个
状态转换到另一个状态.
2. Session 缓存
2.1 在 Session 接口的实现中包含一系列的 Java 集合, 这些 Java 集合构成了 Session 缓存.
只要 Session 实例没有结束生命周期, 且没有清理缓存,
则存放在它缓存中的对象也不会结束生命周期
2.2 Session 缓存可减少 Hibernate 应用程序访问数据库的频率。
3.操作Session缓存。
3.1 flush 缓存
3.1.1 flush:Session 按照缓存中对象的属性变化来同步更新数据库
3.1.2 默认情况下 Session 在以下时间点刷新缓存:
> 显式调用 Session 的 flush() 方法
> 当应用程序调用 Transaction 的 commit()方法的时, 该方法先 flush ,
然后在向数据库提交事务
> 当应用程序执行一些查询(HQL, Criteria)操作时,如果缓存中持久化对象的
属性已经发生了变化,会先 flush 缓存,以保证查询结果能够反映持久化对
象的最新状态。
3.1.3 若记录的id是由底层数据库使用自增的方式生成的(如果对象使用 native 生成器生成 OID),
在调用save()方法后,就会立即发送insert语句,因为save()方法后,必须保证对象的id时存在的。
3.1.4 commit() 和 flush() 方法的区别:
flush 执行一系列 sql 语句,但不提交事务;
commit 方法先调用flush() 方法,然后提交事务.
提交事务意味着对数据库操作永久保存下来。
3.2 refresh() 会强制发送select语句,保证session中的对象与数据库中的数据保持一致。
@Test
public void testSessionRefresh() {
News news = (News) session.get(News.class,5);
System.out.println(news);
session.refresh(news);
System.out.println(news);
}
3.3 clear()会清除session缓存中的对象
@Test
public void testClear(){
News news = (News) session.get(News.class,5);
System.out.println(news);
News news2 = (News) session.get(News.class,5);
System.out.println(news2);
session.clear();
News news3 = (News) session.get(News.class,5);
System.out.println(news3);
}
从控制台可以看出,当清除了缓存以后,需要再次从数据库查询对象。