Hibernate缓存与API

持久化对象三种状态

1.瞬时态:也叫做临时态或自由态,它一般指我们new出来的对象,它不存在OID,与hibernate session无关联,在数据库中也无记录。它使用完成后,会被jvm直接回收掉,它只是用于信息携带。
简单说:无OID 与数据库中的信息无关联,不在session管理范围内。
2.持久态:在hibernate session管理范围内,它具有持久化标识OID它的特点,在事务未提交前一直是持久态,当它发生改变时,hibernate是可以检测到的。
简单说:有OID 由session管理,在数据库中有可能有,也有可有没有。
3.托管态:也叫做游离态或离线态,它是指持久态对象失去了与session的关联,托管态对象它存在OID,在数据库中有可能存在,也有可能不存在。
对于托管态对象,它发生改变时hibernet不能检测到。

判断持久化类对象三种状态:

1.是否有OID
2.判断是否与session关联
1.瞬时态(new 出来的)
瞬时------持久 save saveOrUpdate
瞬时-----脱管(游离) 手动设置oid
2…持久态 它是由session管理
持久-------瞬时 delete() 被删除后持久化对象不在建议使用
持久-----脱管 注意:session它的缓存就是所说的一级缓存
evict(清除一级缓存 中指定的一个对象)
clear(清空一级缓存)
close(关闭,清空一级缓存)
3…脱管态 (它是无法直接获取)
脱管-----瞬时 直接将oid删除
脱管----持久 update saveOrUpdate lock(过时)

Hibernate一级缓存

Hibernate的一级缓存就是指session缓存。

actionQueue它是一个行列队列,它主要记录crud操作的相关信息
persistenceContext它是持久化上下文,它其实是真正缓存。
在session中定义了一系列的集合来存储数据,它们构成session缓存。
只要session没有关闭,它就会一直存在。
当我们通过hibernate中的session提供的一些API例如 save get update等进行操作时,就会将持久化对象保存到session中,当下一次在去查询缓存中具有的对象(OID值来判断),
就不会去从数据库查询,而是直接从缓存中获取。
Hibernate的一级缓存存在的目的就是为了减少对数据库访问。
在hibernate中还有一个二级缓存,它是SessionFactory级别缓存。

Hibernate缓存与API

package HibernateTest;

import java.util.List;

import org.hibernate.Session;
import org.junit.Test;

import utils.HibernateUtils;

public class Test3 {
	@Test
	public void test1() {
		//得到session
		Session session = HibernateUtils.openSession();
		session.beginTransaction();
		
		Customer c = new Customer();//瞬时态(无oid与session级联)
		c.setId(999);
		c.setAddress("广州");
		c.setName("赵六");
		
		session.save(c);//建立了c与session的关联联系,持久态(有oid)
		
		//事务提交
		session.getTransaction().commit();
		session.close();
		
		System.out.println(c.getId());//断开与session的联系,脱管态
	}
	
	//测试一级缓存
	@Test
	public void test2() {
		Session session = HibernateUtils.openSession();
		session.beginTransaction();

		Customer c = session.get(Customer.class, 10); // 查询id=1的customer对象,如果查询到,会将c存储到一级缓存中。
		Customer cc = session.get(Customer.class, 10); // 会从一级缓存
		Customer ccc = session.get(Customer.class, 10);// 中查询,而不会向数据库在发送sql

		// 2.事务提供,关闭
		session.getTransaction().commit();
		session.close();
	}
	
	// 持久化对象具有自动更新数据库能力
	@Test
	public void test4() {
		Session session = HibernateUtils.openSession();
		session.beginTransaction();
		
		Customer c = session.get(Customer.class, 8);
		c.setAddress("漳州");
		
		session.getTransaction().commit();
		session.close();
	}
	
	// 测试一级缓存操作常用API
	@Test
	public void test5() {
		Session session = HibernateUtils.openSession();
		session.beginTransaction();
		//存储数据到一级缓存
		List<Customer> list = session.createQuery("from Customer").list();
		session.clear(); // 清空一级缓存,下面要再查询需要发SQL
		Customer c = session.get(Customer.class, 10); // 会先从session一级缓存中获取,如果不存在,才会发SQL从数据库获取
		//c.setAddress("厦门");
		session.evict(c);// 从一级缓存 中删除一个指定的对象,下面再要获取c这个对象需要发SQL
		Customer cc = session.get(Customer.class, 10);// 会先从session一级缓存中获取,如果不存在,才会发SQL从数据库获取
		cc.setAddress("湘潭");
		System.out.println(cc.getAddress());
		
		session.refresh(cc);// 重新查询数据库,用数据库中信息来更新一级缓存与快照
		
		session.getTransaction().commit();
		session.close();
	}
	
	// session的update操作
	@Test
	public void test6() {
		Session session = HibernateUtils.openSession();
		session.beginTransaction();
		
		
		//得到id=1的 Customer对象
		//Customer cc=session.get(Customer.class, 1); //session一级缓存中存在了一个oid为1的Customer
		
		Customer c = new Customer();
		c.setId(11);
		c.setName("武七");
		c.setAddress("上海");
		
		session.update(c);
		
		session.getTransaction().commit();
		session.close();
	}
	
}






















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值