前言

本博文主要讲解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第七篇【对象状态、一级缓存】相关推荐

  1. (转)Hibernate的一级缓存

    http://blog.csdn.net/yerenyuan_pku/article/details/70148567 Hibernate的一级缓存 Hibernate的一级缓存就是指Session缓 ...

  2. java中一级缓存_JavaWeb_(Hibernate框架)Hibernate中一级缓存

    Hibernate中一级缓存 Hibernate 中的缓存分为一级缓存和二级缓存,这两个级别的缓存都位于持久化层,并且存储的都是数据库数据的备份.其中一级缓存是 Hibernate 的内置缓存,在前面 ...

  3. Hibernate 几种对象状态

    Hibernate 中四种对象状态 临时状态(transient):刚用new 语句创建,还没有被持久化,并且不处于Sesssion 的缓存中.处于临时状态 的Java 对象被称为临时对象. 持久化状 ...

  4. Hibernate 一级缓存,二级缓存,查询缓存

    概念: 1.什么是缓存呢? 缓存:是计算机领域的概念,它介于应用程序和永久性数据存储源之间. 缓存:一般人的理解是在内存中的一块空间,可以将二级缓存配置到硬盘.用白话来说,就是一个存储数据的容器.我们 ...

  5. Hibernate一级缓存管理-evict和clear的用法

    evict方法:从一级缓存中移除一个对象 clear方法:将一级缓存中的对象全部移除 /*** 验证缓存管理的方法evict* 执行完evict之后,将会将id为5的user对象从一级缓存中移除,再次 ...

  6. MyBatis 一级缓存二级缓存详解

    相关内容: 架构师系列内容:架构师学习笔记(持续更新) MyBatis 缓存详解 cache 缓存 缓存是一般的ORM 框架都会提供的功能,目的就是提升查询的效率和减少数据库的压力.跟Hibernat ...

  7. (转)mybatis一级缓存二级缓存

    一级缓存 Mybatis对缓存提供支持,但是在没有配置的默认情况下,它只开启一级缓存,一级缓存只是相对于同一个SqlSession而言.所以在参数和SQL完全一样的情况下,我们使用同一个SqlSess ...

  8. mybatis一级缓存二级缓存

    一级缓存 Mybatis对缓存提供支持,但是在没有配置的默认情况下,它只开启一级缓存,一级缓存只是相对于同一个SqlSession而言.所以在参数和SQL完全一样的情况下,我们使用同一个SqlSess ...

  9. mybatis 三级缓存查询循序_MyBatis手把手跟我做系列(五) --- 一级缓存与二级缓存

    一.什么是缓存 要理解MyBatis的一级缓存,至少,你需要先直接什么是缓存的这个概念,其实我们一直都在用 直接来看下面的图: 对于我们之前的JDBC操作,如果需要连续请求id=1的用户数据,那么就需 ...

最新文章

  1. 网络对抗技术_实验二_网络嗅探与欺骗
  2. 如何将你拍摄的照片转换成全景图及六面体(PTGui)
  3. learning to rank
  4. 经典C语言程序100例之七二
  5. 工单更改历史记录(轉載)
  6. java mvc 导出excel_Java springMVC POI 导出 EXCEL
  7. MyBatis核心接口和类
  8. [JSP]自定义标签库taglib
  9. day 39 mycql 数据库之约束
  10. AJAX跨域问题解决一:使用web代理
  11. python下载教程-如何下载python包
  12. 航模飞机设计基础知识
  13. [目标检测系列]ATSS: Bridging the Gap Between Anchor-based and Anchor-free Detection via ATSS(CVPR2020)
  14. 华为笔记本linux好不好,华为笔记本怎么样
  15. 初中英语语法(003)-be动词和一般动词的一般过去式
  16. python系列之:字典update
  17. 【jzoj5335】早苗
  18. mysql统计缺勤的天数_缺勤天数统计的处理示例.sql
  19. 光驱叹号,我的电脑看不见光驱
  20. 用C语言实现简单的神经元

热门文章

  1. java,NIO非阻塞式网络通信DEMO.
  2. 部署项目vue +阿里云服务器 + 宝塔面板
  3. 自组织竞争网络(SOM)
  4. ARP协议(三)ARP防御篇
  5. Unity -- 粒子系统,拖尾与线
  6. 同余 在计算机中的应用 算法,线性乘同余法在购车摇号中的应用
  7. 快速搭建个人博客网站——Hexo
  8. ios label文字行间距_UILabel UITextField调整行间距【原创】
  9. 02优先队列和索引优先队列-优先队列-数据结构和算法(Java)
  10. 【解决方案】IDEA 配合 gradle 时候无法正确编译资源文件resources的问题