持久化类与缓存
1
持久化
什么是持久化?
将内存中的对象持久化到本地(以数据库保存下来)的过程
什么是持久化类?
和数据库表建立映射的java类(java类+映射文件)
持久化类的编写规则?
2
持久化类三态
Hibernate为了更好的管理持久化类,将持久化类对象分为三种状态
瞬时态 | 没有唯一的OID没有被session管理 |
---|---|
持久态 | 有唯一的OID有被session管理 |
游离态/托管态/离线态 | 有唯一的OID没有被session管理 |
三种状态区分
瞬时态:刚new出对象时,还没有设置id,还没有被session所管理
持久态:已经有了id,调用session方法,把对象给session,才被session所管理,添加到session之后, 对象一直处理持久态,当对象处理持久态时, 可以自动更新数据库
游离态:把session关闭掉时close时,对象处理游离态
持久态特性(原理:依赖于一级缓存)
Session session = HibernateUtil.openSession();
//开启事务
Transaction transaction = session.beginTransaction();
//获取持久态对象
Student stu = session.get(Student.class,1);
//不用update,持久态下能自动更新
stu.setName(“王五”);
transaction.commit();
3一级缓存
什么是缓存?
是一种优化的方式,将数据存入到内存当中,使用的时候直接从缓存中获取,不用直接到存储源中取数据了
一级缓存
二级缓存
是SessionFactory级别的缓存,需要自己去配置,默认是开启的,在企业当中一般都不用了,现在都redis
一级缓存特点
Session session = HibernateUtil.openSession();
Transaction transaction = session.beginTransaction();
//第一次获取,缓存中没有数据,要发送sql
Student stu = session.get(Student.class,1);
System.out.println(stu);
//再次查询同一个,缓存中已经有了无需再发送sql
Student stu1 = session.get(Student.class,1);
System.out.println(stu);
//同一个对象
System.out.println(stu == stu1);
transaction.commit();
当使用Session接口的Save()、update()、saveOrUpdate()时,如果session缓存中没有相应的对象,就会自动的从数据库查询相应的信息,写到缓存当中
当调用Session接口的load,get()方法,以及Query接口的list iterator方法时, 会判断缓存中是否存在该对象,有则返回, 不会查询数据库,如果缓存中没有要查询的对象,再到数据库当中查询对应的对象,并添加到一级缓存中
当调用session.close方法时,缓存会被清空
持久态为什么可以自动更新?
Session session = HibernateUtil.openSession();
//开启事务
Transaction transaction = session.beginTransaction();
//获取持久态对象
Student stu = session.get(Student.class,1);
//不用update,持久态下能自动更新
stu.setName(“王五”);
transaction.commit();
在缓存区中还有一个快照区,按前面的所说,当对象由session管理时将对象存入缓存,除此之外还会复制一份到快照区。我们再获取使用这个对象时是从缓存当中获取,并且设置了新的值,但快照是不变的是最开始创建缓存的复制,当事务提交时会对比缓存中和快照中对应的对象是否一样,若不一样则发送update语句修改。
清空缓存
clear() | 清空所有缓存 |
---|---|
evict(obj) | 清空一个对象 |