Hibernate第七篇【对象状态、一级缓存】
前言
本博文主要讲解Hibernate的细节—->对象的状态和一级缓存…
对象状态
Hibernate中对象的状态:
- 临时/瞬时状态
- 持久化状态
- 游离状态
学习Hibernate的对象状态是为了更清晰地知道Hibernate的设计思想,以及是一级缓存的基础…当然啦,也就一点点知识
临时/瞬时状态
当我们直接new出来的对象就是临时/瞬时状态的..
- 该对象还没有被持久化【没有保存在数据库中】
- 不受Session的管理
持久化状态
当保存在数据库中的对象就是持久化状态了
- 当调用session的save/saveOrUpdate/get/load/list等方法的时候,对象就是持久化状态
- 在数据库有对应的数据
- 受Session的管理
- 当对对象属性进行更改的时候,会反映到数据库中!
我们来测试一下:当对对象属性进行更改的时候,会反映到数据库中!
session.save(idCard);idCard.setIdCardName("我是测试持久化对象");
游离状态
当Session关闭了以后,持久化的对象就变成了游离状态了…
- 不处于session的管理
- 数据库中有对应的记录
一级缓存
Hibernate有一级缓存和二级缓存之分,这里主要讲解一级缓存
什么是一级缓存?
Hibenate中一级缓存,也叫做session的缓存,它可以在session范围内减少数据库的访问次数! 只在session范围有效! Session关闭,一级缓存失效!
只要是持久化对象状态的,都受Session管理,也就是说,都会在Session缓存中!
Session的缓存由hibernate维护,用户不能操作缓存内容; 如果想操作缓存内容,必须通过hibernate提供的evit/clear方法操作。
为什么要是使用缓存?
减少对数据库的访问次数!从而提升hibernate的执行效率!
测试
我们来看一下Hibernate是怎么减少对数据库访问的次数的。
现在我的User表有这么一条记录:
//把数据放进cacheUser user = (User) session.get(User.class, 1);//发现要修改的字段和cache一样,不执行user.setUserName("你好2");
取数据也是一样的
User user = null;user = (User) session.get(User.class, 1);user = (User) session.get(User.class, 1);
缓存相关的方法
和缓存有关常用的方法有三个:
- session.flush(); 让一级缓存与数据库同步
- session.evict(arg0); 清空一级缓存中指定的对象
session.clear(); 清空一级缓存中缓存的所有对象
clear
User user = null;user = (User) session.get(User.class, 1);//清除缓存,那么下面获取的时候,就不能从缓存里面拿了session.clear();user = (User) session.get(User.class, 1);
- flush
在有缓存的情况下,修改同一条记录的数据,以最后的为准…因此只有一条update
User user = null;user = (User) session.get(User.class, 1);user.setUserName("我是第一");user = (User) session.get(User.class, 1);user.setUserName("我是第二");
我让强制让它和数据库同步的话,就有两条update了
User user = null;user = (User) session.get(User.class, 1);user.setUserName("我是第一");session.flush();user = (User) session.get(User.class, 1);user.setUserName("我是第二");
一般地,我们在批处理的时候会用,因为缓存也是有大小的,如果1000条数据插入进去都要缓存,那么Hibernate可能就崩了…
- 每隔一定记录数,先与数据库同步 flush()
- 再清空缓存 clear()
值得注意的是:不同的Session是不会共享缓存的!
Iterator与list
我们使用HQL查询全部数据的时候,可以使用list()得到所有的数据,也可以使用iterator()得到一个迭代器,再遍历迭代器…那它们有什么区别呢?
。。。。当时看视频的时候说是下图:
但是我在测试的时候:List也可以获取缓存的数据
当然啦,Iterator也是可以获取缓存的数据
因此,在获取数据的时候还是使用list()方便!
<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>
Hibernate第七篇【对象状态、一级缓存】相关推荐
- (转)Hibernate的一级缓存
http://blog.csdn.net/yerenyuan_pku/article/details/70148567 Hibernate的一级缓存 Hibernate的一级缓存就是指Session缓 ...
- java中一级缓存_JavaWeb_(Hibernate框架)Hibernate中一级缓存
Hibernate中一级缓存 Hibernate 中的缓存分为一级缓存和二级缓存,这两个级别的缓存都位于持久化层,并且存储的都是数据库数据的备份.其中一级缓存是 Hibernate 的内置缓存,在前面 ...
- Hibernate 几种对象状态
Hibernate 中四种对象状态 临时状态(transient):刚用new 语句创建,还没有被持久化,并且不处于Sesssion 的缓存中.处于临时状态 的Java 对象被称为临时对象. 持久化状 ...
- Hibernate 一级缓存,二级缓存,查询缓存
概念: 1.什么是缓存呢? 缓存:是计算机领域的概念,它介于应用程序和永久性数据存储源之间. 缓存:一般人的理解是在内存中的一块空间,可以将二级缓存配置到硬盘.用白话来说,就是一个存储数据的容器.我们 ...
- Hibernate一级缓存管理-evict和clear的用法
evict方法:从一级缓存中移除一个对象 clear方法:将一级缓存中的对象全部移除 /*** 验证缓存管理的方法evict* 执行完evict之后,将会将id为5的user对象从一级缓存中移除,再次 ...
- MyBatis 一级缓存二级缓存详解
相关内容: 架构师系列内容:架构师学习笔记(持续更新) MyBatis 缓存详解 cache 缓存 缓存是一般的ORM 框架都会提供的功能,目的就是提升查询的效率和减少数据库的压力.跟Hibernat ...
- (转)mybatis一级缓存二级缓存
一级缓存 Mybatis对缓存提供支持,但是在没有配置的默认情况下,它只开启一级缓存,一级缓存只是相对于同一个SqlSession而言.所以在参数和SQL完全一样的情况下,我们使用同一个SqlSess ...
- mybatis一级缓存二级缓存
一级缓存 Mybatis对缓存提供支持,但是在没有配置的默认情况下,它只开启一级缓存,一级缓存只是相对于同一个SqlSession而言.所以在参数和SQL完全一样的情况下,我们使用同一个SqlSess ...
- mybatis 三级缓存查询循序_MyBatis手把手跟我做系列(五) --- 一级缓存与二级缓存
一.什么是缓存 要理解MyBatis的一级缓存,至少,你需要先直接什么是缓存的这个概念,其实我们一直都在用 直接来看下面的图: 对于我们之前的JDBC操作,如果需要连续请求id=1的用户数据,那么就需 ...
最新文章
- 网络对抗技术_实验二_网络嗅探与欺骗
- 如何将你拍摄的照片转换成全景图及六面体(PTGui)
- learning to rank
- 经典C语言程序100例之七二
- 工单更改历史记录(轉載)
- java mvc 导出excel_Java springMVC POI 导出 EXCEL
- MyBatis核心接口和类
- [JSP]自定义标签库taglib
- day 39 mycql 数据库之约束
- AJAX跨域问题解决一:使用web代理
- python下载教程-如何下载python包
- 航模飞机设计基础知识
- [目标检测系列]ATSS: Bridging the Gap Between Anchor-based and Anchor-free Detection via ATSS(CVPR2020)
- 华为笔记本linux好不好,华为笔记本怎么样
- 初中英语语法(003)-be动词和一般动词的一般过去式
- python系列之:字典update
- 【jzoj5335】早苗
- mysql统计缺勤的天数_缺勤天数统计的处理示例.sql
- 光驱叹号,我的电脑看不见光驱
- 用C语言实现简单的神经元
热门文章
- java,NIO非阻塞式网络通信DEMO.
- 部署项目vue +阿里云服务器 + 宝塔面板
- 自组织竞争网络(SOM)
- ARP协议(三)ARP防御篇
- Unity -- 粒子系统,拖尾与线
- 同余 在计算机中的应用 算法,线性乘同余法在购车摇号中的应用
- 快速搭建个人博客网站——Hexo
- ios label文字行间距_UILabel UITextField调整行间距【原创】
- 02优先队列和索引优先队列-优先队列-数据结构和算法(Java)
- 【解决方案】IDEA 配合 gradle 时候无法正确编译资源文件resources的问题