Hibernate 的一级缓存机制的作用:
1.如果 session 被查询,session 将先到缓存中查找是否有被查询的对象,找到则直接返回该对象,否则才查询数据库
2.缓存中的对象如果状态发生改变,会被标记下来(即维护对象的状态),当执行 session.flush()
时会将改变同步到数据库中
当调用 session.evict(Object obj) 时,会将对象 obj 从 session 缓存中清除掉。
测试代码:
/**
* session一级缓存测试(会话级缓存)
*
* @param
* @return
* @throws
* @author liaowenxiong
* @date 2022/7/2 20:38
*/
@Test
public void testSessionLevelCache() {
Session session = HibernateUtils.getSession();
Transaction tx = session.beginTransaction();
// 首次获取id=1的Employee对象,在Session一级缓存中没有该对象,于是会去查询数据库,因为被Session
// 处理过的对象会处于持久态,于是这个对象(e1所指向的对象)就是持久态的,会缓存在session中
Employee e1 = session.get(Employee.class, 3);
// 第二次获取id=1的Employee对象,会去session缓存中查找,存在则直接返回该对象
Employee e2 = session.get(Employee.class, 3);
// 所以e1和e2是同一个对象
System.out.println(e1 == e2); // 结果为true
e1.setNickname("liaowenxiong123");
session.flush();// 会将对象e1的更新同步到数据库中
session.evict(e1); // 将对象e1从缓存中清除,此时对象e1处于游离态
e1.setNickname("liaowenxiong234");// e1与session脱离了关系,因此后面提交事务时即使执行了flush()也不会将对象e1的更新同步到数据库中
tx.commit();
session.close();
}