package com.itheima.b_cache;
import java.util.List;
import org.hibernate.Session;
import org.junit.Test;
import com.itheima.domain.User;
import com.itheima.utils.HibernateUtils;
//session缓存 的细节问题
public class Demo2 {
@Test
//1.保存对象时使用 save方法
// 保存对象时使用 persist方法
// 区别? 没有区别
// persist(持久) 方法 来自于JPA 接口
// save(保存) 方法来自于Hibernate
public void fun1(){
Session session = HibernateUtils.openSession();
//session.beginTransaction();
//------------------------------------------------
User u = new User();
u.setName("张三");
//session.save(u); //insert语句被打印=> 目的:获得id
session.persist(u); //insert语句被打印=> 目的:获得id
//------------------------------------------------
//session.getTransaction().commit();
session.close(); // 游离状态
}
//2.1 HQL查询是否会使用一级缓存? HQL不会使用一级缓存.
@Test
public void fun2(){
Session session = HibernateUtils.openSession();
session.beginTransaction();
//------------------------------------------------
List<User> list1 = session.createQuery("from User").list();
List<User> list2 = session.createQuery("from User").list();
List<User> list3 = session.createQuery("from User").list();
//------------------------------------------------
session.getTransaction().commit();
session.close(); // 游离状态
}
//2.2 HQL语句批量查询时,查询结果是否会进入缓存? 查询结果会放入缓存中
@Test
public void fun3(){
Session session = HibernateUtils.openSession();
session.beginTransaction();
//------------------------------------------------
List<User> list1 = session.createQuery("from User").list();
User u = (User) session.get(User.class, 1);
//------------------------------------------------
session.getTransaction().commit();
session.close(); // 游离状态
}
@Test
//3.1 SQL查询 结果会不会放入1级缓存中? 如果把查询结果封装到对象中,对象会放入一级缓存
public void fun4(){
Session session = HibernateUtils.openSession();
session.beginTransaction();
//------------------------------------------------
List<User> list1 = session.createSQLQuery("select * from t_user").addEntity(User.class).list();
User u = (User) session.get(User.class, 1);
System.out.println(u);
//------------------------------------------------
session.getTransaction().commit();
session.close(); // 游离状态
}
@Test
//3.2 SQL查询 结果会不会放入1级缓存中?没有把查询结果封装到对象中,对象不会放入一级缓存
public void fun5(){
Session session = HibernateUtils.openSession();
session.beginTransaction();
//------------------------------------------------
List list1 = session.createSQLQuery("select * from t_user").list();
User u = (User) session.get(User.class, 1);
System.out.println(u);
//------------------------------------------------
session.getTransaction().commit();
session.close(); // 游离状态
}
//criteria => 会将查询结果放入一级缓存. 但是查询不会使用一级缓存. 与Hql查询结论一致.
}
//产生疑问:
package com.itheima.c_question;
import java.util.List;
import org.hibernate.Session;
import org.junit.Test;
import com.itheima.domain.User;
import com.itheima.utils.HibernateUtils;
//2 Hql查询,查询结果会放入Session一级缓存中.但是每次调用Hql查询都会生成Sql语句?
// 并不代表 Hql没有使用1级缓存.
public class Demo2 {
@Test
public void fun1(){
Session session = HibernateUtils.openSession();
session.beginTransaction();
//------------------------------------------------
List<User> list1 = session.createQuery("from User").list(); // 发送sql
List<User> list2 = session.createQuery("from User").list();// 发送sql
System.out.println(list1.get(0)==list2.get(0));//true =>
//------------------------------------------------
session.getTransaction().commit();
session.close(); // 游离状态
}
//问题: 缓存中的数据如果与数据库中的不同步,会怎么样?
// 会优先使用缓存中的. 使用JDBC
// 在一级缓存中出现该问题的几率比较小.
//openSession==> 一级缓存生命周期开始
//session.close();=> 一级缓存销毁
@Test
public void fun2(){
Session session = HibernateUtils.openSession();
session.beginTransaction();
//------------------------------------------------
User u1 = (User) session.get(User.class, 1);
User u2 = (User) session.get(User.class, 1);
//------------------------------------------------
session.getTransaction().commit();
session.close(); // 游离状态
}
}
query查询流程图:::::::