package com.tarena.test;
hibernate中session缓存(一级缓存)
原创
©著作权归作者所有:来自51CTO博客作者业渠的原创作品,请联系作者获取转载授权,否则将追究法律责任
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();
}
}
}
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
Java中的缓存框架
Java中的缓存框架
缓存 spring ide -
Hibernate缓存机制之一级缓存
Hibernate缓存机制之一级缓存什么是缓存缓存是介于应用程序和物理数据源之间,其作用是为了降低应用程序对物理数据源访问的的存在数据库中有一条St
hibernate 缓存机制 缓存 数据 一级缓存 -
【hibernate框架】缓存机制之一级缓存
什么是缓存:我们在内存中开辟一块空间,把本来应该存储在硬盘上的东西,然
session sql 缓存机制 一级缓存 hibernate -
Hibernate学习之一级缓存
为什么需要缓存:当我们去查询对象的时候,首先到一级缓存去取数据,如果有,则不
Hibernate session级缓存 缓存 数据库 一级缓存