#2020云栖大会#阿里云海量offer来啦!投简历、赢阿里云限量礼品及阿里云ACA认证免费考试资格!>>>
![8c6792febcf7d53dd2ce21c2fe7452f1dfe.png](https://i-blog.csdnimg.cn/blog_migrate/462c80470e67c57d2d875f68a0179e0b.png)
持久化
状态划分
一级缓存
![268080941da9532ec46850e9b467fa3f845.gif](https://i-blog.csdnimg.cn/blog_migrate/7c857c5202b03b8157b94ec4e5bb49d6.gif)
什么是持久化?
将内存中的对象持久化到本地(以数据库保存下来)的过程
什么是持久化类?
和数据库表建立映射的java类(java类+映射文件)
持久化类的编写规则?
要有无参构造方法(内部通过字节码创建对象获取属性信息)
私有字段要有get,set方法d
对象持久化类提供一个OID与数据库表当中的主键对应(通过OID来判断是否是一个对象)
属性类型尽量为包装类型
持久化类不能用final修饰(会有继承)
![268080941da9532ec46850e9b467fa3f845.gif](https://i-blog.csdnimg.cn/blog_migrate/7c857c5202b03b8157b94ec4e5bb49d6.gif)
![268080941da9532ec46850e9b467fa3f845.gif](https://i-blog.csdnimg.cn/blog_migrate/7c857c5202b03b8157b94ec4e5bb49d6.gif)
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();
![268080941da9532ec46850e9b467fa3f845.gif](https://i-blog.csdnimg.cn/blog_migrate/7c857c5202b03b8157b94ec4e5bb49d6.gif)
![268080941da9532ec46850e9b467fa3f845.gif](https://i-blog.csdnimg.cn/blog_migrate/7c857c5202b03b8157b94ec4e5bb49d6.gif)
什么是缓存?
是一种优化的方式,将数据存入到内存当中,使用的时候直接从缓存中获取,不用直接到存储源中取数据了
一级缓存
session级别的缓存
生命周期与Session一致
一级缓存是由Session中的一系列Java集合构成的
是自带的, 不可卸载
二级缓存
是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) | 清空一个对象 |
![268080941da9532ec46850e9b467fa3f845.gif](https://i-blog.csdnimg.cn/blog_migrate/7c857c5202b03b8157b94ec4e5bb49d6.gif)
![db7150a74310a7ac0c3205bf8e4cc2d36e6.png](https://i-blog.csdnimg.cn/blog_migrate/a1dabcaeca4b37e89ce925f02e9875a6.png)
![9a5fdba60e094ab6cca55cad47a371387ab.jpg](https://i-blog.csdnimg.cn/blog_migrate/4f3e61feb8e4f9c55a3222407326bfa3.jpeg)
它,
不仅仅是一个码
本文分享自微信公众号 - IT那个小笔记(qq1839646816)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。