对象分三种状态
- 【瞬时状态】没有id,没有在session缓存中
- 【持久化状态】 有id,在session缓存中
- 【游离|托管状态】有id,没有在session缓存中
三种状态的转换图
PS:
1.new 出一个对象,是瞬时状态的。
2.session.get(Customer.class,1l)从数据库取出来的都是持久化状态的;
3.session.close();释放资源会从持久化状态=>游离|托管状态;
4.saveOrUpdate()方法我们无需关心瞬时状态转成持久化的过程.
hibernate进阶–缓存原理
缓存:提高效率.hibernate中的一级缓存也是为了提高操作数据库的效率.
1.提高查询效率
先看一段代码
@Test
//保存客户
public void fun1(){
//1.获得session
Session session = XHibernateUtil.openSession();
//2.控制事务
Transaction tx = session.beginTransaction();
//3.执行操作
Customer c1 = session.get(Customer.class, 1l);
Customer c2 = session.get(Customer.class, 1l);
Customer c3 = session.get(Customer.class, 1l);
Customer c4 = session.get(Customer.class, 1l);
Customer c5 = session.get(Customer.class, 1l);
Customer c6 = session.get(Customer.class, 1l);
System.out.println("c3========c5 "+(c3==c5));
//4.提交事务,关闭资源
tx.commit();
session.close();
}
控制台输出
Hibernate:
select
customer0_.cust_id as cust_id1_0_0_,
customer0_.cust_name as cust_nam2_0_0_,
customer0_.cust_source as cust_sou3_0_0_,
customer0_.cust_industry as cust_ind4_0_0_,
customer0_.cust_level as cust_lev5_0_0_,
customer0_.cust_linkman as cust_lin6_0_0_,
customer0_.cust_phone as cust_pho7_0_0_,
customer0_.cust_mobile as cust_mob8_0_0_
from
cst_customer customer0_
where
customer0_.cust_id=?
c3========c5 true
发现拿到的对象是一样的,同一个对象
来看看过程:
PS:说白了也就是去读数据库时,优先读取缓存,如果存在就返回。
2.减少不必要的修改语句发送
再看一段代码
@Test
//更新
public void fun1(){
//1.获得session
Session session = XHibernateUtil.openSession();
//2.控制事务
Transaction tx = session.beginTransaction();
//3.执行操作
Customer c1 = session.get(Customer.class, 1l);
c1.setCust_name("haha001====");
c1.setCust_name("haha002====");
//4.提交事务,关闭资源
tx.commit();
session.close();
}
控制台输出
Hibernate:
select
customer0_.cust_id as cust_id1_0_0_,
customer0_.cust_name as cust_nam2_0_0_,
customer0_.cust_source as cust_sou3_0_0_,
customer0_.cust_industry as cust_ind4_0_0_,
customer0_.cust_level as cust_lev5_0_0_,
customer0_.cust_linkman as cust_lin6_0_0_,
customer0_.cust_phone as cust_pho7_0_0_,
customer0_.cust_mobile as cust_mob8_0_0_
from
cst_customer customer0_
where
customer0_.cust_id=?
Hibernate:
update
cst_customer
set
cust_name=?,
cust_source=?,
cust_industry=?,
cust_level=?,
cust_linkman=?,
cust_phone=?,
cust_mobile=?
where
cust_id=?
我们会发现修改语句只有一条。
来看看过程:
PS:多次操作它会比对数据是否发生变化,有变化才会更改