package com.tarena.test;sql
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();
}
}
}