Hibernate第七篇【对象状态、一级缓存】

前言

本博文主要讲解Hibernate的细节—->对象的状态和一级缓存

对象状态

Hibernate中对象的状态:
- 临时/瞬时状态
- 持久化状态
- 游离状态

学习Hibernate的对象状态是为了更清晰地知道Hibernate的设计思想,以及是一级缓存的基础…当然啦,也就一点点知识

临时/瞬时状态

当我们直接new出来的对象就是临时/瞬时状态的..

  • 该对象还没有被持久化【没有保存在数据库中】
  • 不受Session的管理

这里写图片描述

持久化状态

当保存在数据库中的对象就是持久化状态了

  • 当调用session的save/saveOrUpdate/get/load/list等方法的时候,对象就是持久化状态
  • 在数据库有对应的数据
  • 受Session的管理
  • 当对对象属性进行更改的时候,会反映到数据库中!

这里写图片描述

我们来测试一下:当对对象属性进行更改的时候,会反映到数据库中!

1 session.save(idCard); 2 idCard.setIdCardName("我是测试持久化对象");

这里写图片描述

游离状态

当Session关闭了以后,持久化的对象就变成了游离状态了…

  • 不处于session的管理
  • 数据库中有对应的记录

这里写图片描述


一级缓存

Hibernate有一级缓存和二级缓存之分,这里主要讲解一级缓存

什么是一级缓存?

Hibenate中一级缓存,也叫做session的缓存,它可以在session范围内减少数据库的访问次数! 只在session范围有效! Session关闭,一级缓存失效!

只要是持久化对象状态的,都受Session管理,也就是说,都会在Session缓存中!

Session的缓存由hibernate维护,用户不能操作缓存内容; 如果想操作缓存内容,必须通过hibernate提供的evit/clear方法操作

为什么要是使用缓存?

减少对数据库的访问次数!从而提升hibernate的执行效率!

测试

我们来看一下Hibernate是怎么减少对数据库访问的次数的。

现在我的User表有这么一条记录:

这里写图片描述

1 //把数据放进cache 2 User user = (User) session.get(User.class, 1); 3 4 //发现要修改的字段和cache一样,不执行 5 user.setUserName("你好2");

这里写图片描述

这里写图片描述

取数据也是一样的

1 User user = null; 2 user = (User) session.get(User.class, 1); 3 user = (User) session.get(User.class, 1);

这里写图片描述


缓存相关的方法

和缓存有关常用的方法有三个:

  • session.flush(); 让一级缓存与数据库同步

  • session.evict(arg0); 清空一级缓存中指定的对象

  • session.clear(); 清空一级缓存中缓存的所有对象

  • clear

    1 User user = null; 2 user = (User) session.get(User.class, 1); 3 4 //清除缓存,那么下面获取的时候,就不能从缓存里面拿了 5 session.clear(); 6 user = (User) session.get(User.class, 1);
  • flush

在有缓存的情况下,修改同一条记录的数据,以最后的为准…因此只有一条update

1 User user = null; 2 user = (User) session.get(User.class, 1); 3 4 user.setUserName("我是第一"); 5 user = (User) session.get(User.class, 1); 6 user.setUserName("我是第二");

这里写图片描述

我让强制让它和数据库同步的话,就有两条update了

1 User user = null; 2 user = (User) session.get(User.class, 1); 3 4 user.setUserName("我是第一"); 5 session.flush(); 6 user = (User) session.get(User.class, 1); 7 user.setUserName("我是第二");

这里写图片描述

一般地,我们在批处理的时候会用,因为缓存也是有大小的,如果1000条数据插入进去都要缓存,那么Hibernate可能就崩了

  • 每隔一定记录数,先与数据库同步 flush()
  • 再清空缓存 clear()

值得注意的是:不同的Session是不会共享缓存的!

Iterator与list

我们使用HQL查询全部数据的时候,可以使用list()得到所有的数据,也可以使用iterator()得到一个迭代器,再遍历迭代器…那它们有什么区别呢?

。。。。当时看视频的时候说是下图:

这里写图片描述

但是我在测试的时候:List也可以获取缓存的数据

这里写图片描述

当然啦,Iterator也是可以获取缓存的数据

这里写图片描述

因此,在获取数据的时候还是使用list()方便!

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

一篇文章带你了解JavaScript日期

日期对象允许您使用日期(年、月、日、小时、分钟、秒和毫秒)。一、JavaScript的日期格式一个JavaScript日期可以写为一个字符串:ThuFeb02201909:59:51GMT0800(中国标准时间)或者是一个数字:1486000791164写数字的日期,指定的毫秒数自1970年1月1日00:00:00到现在。1\.显示日期使用