package com.tarena.test;

 
import org.hibernate.Session;
import org.junit.Test;
 
import com.tarena.po.Dept;
import com.tarena.util.HibernateUtil;
public class Cache1Test {
// 同一个session 中发出两次load操作,加载同一个对象
@Test
public void testLoad1(){
Session session = null;
try {
session = HibernateUtil.getSession();
Dept dept = (Dept) session.load(Dept.class, 1);
System.out.println(dept.getDname());
System.out.println("--------------------------------------");
//没有发出sql语句,load()方法支持一级缓存,第1次使用load()发出
// sql语句,根据id去数据库中查询dept对象 ,该id 的对象保存到了
// 一级缓存中
// 当第2次再去查询同一个id的对象时候,hibernate会先去一级
// 缓存中,查看,有直接使用,没有,发出sql去数据库中查询
Dept dept2 = (Dept) session.load(Dept.class, 1);
System.out.println(dept2.getDname());
} catch (Exception e) {
e.printStackTrace();
} finally{
HibernateUtil.closeSession();
}
}
// 同一个session,使用两次get(),查询同一个id 的对象
@Test
public void testGet1(){
Session session = null;
try {
session =HibernateUtil.getSession();
Dept dept =  (Dept) session.get(Dept.class, 1);
System.out.println(dept.getDname());
System.out.println("-----------------------------------");
//没有发出sql,get()方法也支持一级缓存
Dept dept2 = (Dept) session.get(Dept.class, 1);
System.out.println(dept2.getDname());
} catch (Exception e) {
e.printStackTrace();
} finally{
HibernateUtil.closeSession();
}
}
// 同一个session,使用list()查询同一个id对象
@Test
public void testList1(){
Session session = null;
try {
session = HibernateUtil.getSession();
Dept dept =
(Dept) session.createQuery("from Dept where id = 1")
.list().get(0);
System.out.println(dept.getDname());
System.out.println("-------------------------------------");
//发出sql语句?
// 第1问题: list把查询出来dept对象有没有放到一级缓存中? //list()可以放进缓存,但是不能取出来。
// 第2问题: 假设dept保存到一级缓冲,list 能不能从一级
//       缓存中读取出来? //不能取出来
Dept dept2 = 
(Dept) session.createQuery("from Dept where id = 1")
.list().get(0);
System.out.println(dept2.getDname());
} catch (Exception e) {
e.printStackTrace();
} finally{
HibernateUtil.closeSession();
}
}
//在同一个session当中,两次使用iterate()查询同一个id的对象
// iterate()可以读写一级缓存
@Test
public void testIterate1(){
Session session = null;
try {
session = HibernateUtil.getSession();
Dept dept = (Dept) session.createQuery(
"from Dept where id =1")
.iterate().next();
System.out.println(dept.getDname());
System.out.println("-----------------------------------");
/*Hibernate: select dept0_.id as col_0_0_ from t_dept dept0_ where dept0_.id=1
//只发出了查询id的sql语句,没有发出根据id查询对象的sql语句
02 Dept
 * 第1次使用iterate(),出现了n+1的问题,把对象保存到一级缓存中
 * id没有保存到一级缓存中
 * 第2次使用iterate(),首先去发出查询id的sql语句,根据id,先
 * 去一级缓存中,查找对象,有,责直接使用,没有,再去访问数据库
 * */
Dept dept2 = (Dept) session.createQuery(
"from Dept where id=1")
.iterate().next();
System.out.println(dept2.getDname());
} catch (Exception e) {
e.printStackTrace();
}finally{
HibernateUtil.closeSession();
}
}
// list 只能把对象写入一级缓存中,不能从一级缓存中读取对象
// 在同一个session中,首先使用list(),然后是iterate()
// 1) 如果list能把dept写到一级缓存中,再次调用iterate()就
//    只查询id
// 2) 如果list没有把dept写到一级缓存中,再次调用iterate()
// n+1问题
@Test
public void  testListIterate(){
Session session = null;
try {
session = HibernateUtil.getSession();
Dept dept = (Dept) session.createQuery(
"from Dept").list().get(0);
System.out.println(dept.getDname());
System.out.println("---------------------------");
Dept dept2 = (Dept) session.createQuery(
"from Dept").iterate().next();
System.out.println(dept2.getDname());
} catch (Exception e) {
e.printStackTrace();
} finally{
HibernateUtil.closeSession();
}
}
//在一个session中, 使用2次iterate()查询属性
// 一级缓存不保存属性
@Test
public void testIterate2(){
Session session = null;
try {
session = HibernateUtil.getSession();
String name=  (String) session.createQuery(
"select dname from Dept").iterate().next();
System.out.println(name);
System.out.println("-------------------------------------");
String name2 = (String) session.createQuery(
"select dname from Dept").iterate().next();
System.out.println(name2);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
} finally{
HibernateUtil.closeSession();
}
}
// 一级缓存的生命周期问题
// 一级缓存的生命周期跟session一致,当session关闭的时候,
// 一级缓存关闭,所以一级缓存也叫session级缓存
// 两个session,使用load()方法分别查询同一个id的对象
@Test
public void testload2(){
Session session = null;
try {
session = HibernateUtil.getSession();
Dept dept = (Dept) session.load(Dept.class, 1);
System.out.println(dept.getDname());
} catch (Exception e) {
e.printStackTrace();
} finally{
HibernateUtil.closeSession();
}
System.out.println("---------------------------------");
try {
session = HibernateUtil.getSession();
Dept dept = (Dept) session.load(Dept.class, 1);
System.out.println(dept.getDname());
} catch (Exception e) {
e.printStackTrace();
} finally{
HibernateUtil.closeSession();
}
}
// 在一个session中,先save(),在使用load 加载这个对象
// save支持一级缓存
@Test
public void testSaveLoad(){
Session session = null;
try {
session = HibernateUtil.getSession();
session.beginTransaction();
Dept dept = new Dept();
dept.setDname("shishi");
session.save(dept);
session.getTransaction().commit();
Dept dept2 =(Dept) session.load(Dept.class, 2);
//没有发出sql语句
System.out.println(dept2.getDname());
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
} finally{
HibernateUtil.closeSession();
}
}
}