实体类的状态与Hibernate缓存
一、Hibernate中实体类的三种状态
1、瞬时态
该状态下实体类对象的id属性没有值,该对象和session也没有关系。
实例:
UserEntity user = new UserEntity();
user.setName("jack");
user.setPwd("123");
user.setScore(98.5f);
2、持久态
该状态下,实体类的对象的id属性有值,该对象和session也有关系。
实例:
UserEntity userEntity =session.get(UserEntity.class, 1);
3、托管态
该状态下;实体类的对象的id有值,但是和session没有关系。
实例:
UserEntity userEntity = new UserEntity();
userEntity.setUid(1);
二、Hibernate的缓存
1、什么是缓存
数据一般情况下存在数据库中,数据库本身是文件系统,存储在硬盘中,要读取该数据需要使用流,这样访问效率不是很高。
缓存就是把数据保存在内存中,这样就可以直接读取,提高访问速度。
2、Hibernate缓存分类
在Hibernate中,有一级缓存和二级缓存。
(1)Hibernate的一级缓存特点:
- 默认打开,不需要额外配置,直接使用。
- 有使用的范围,该范围就是session对象的范围,从session对象被创建开始,到session对像关闭结束
- 缓存中存储的数据必须是持久态的数据。
(2)代码验证一级缓存的存在
原理:多次去查询同一条记录,如果访问了数据库就会在控制台打印出底层的sql语句,通过观察输
出,就可以验证该缓存的存在
代码:
@Test
public void Test6(){
SessionFactory sessionFactory = HibernateUtils.getFactory();
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
UserEntity userEntity1 = session.get(UserEntity.class, 2);
System.out.println(userEntity1);
UserEntity userEntity2 = session.get(UserEntity.class, 2);
System.out.println(userEntity2);
tx.commit();
session.close();
sessionFactory.close();
}
验证结果:
(3)一级缓存的执行过程
在查询时,首先去一级缓存中查找该数据,如果有直接将数据组装成一个新对象返回,如果没有该数据,则去数据库中查询该数据
查询成功后将该数据保存到一级缓存(不保存对象,而是保存该对象的值),然后在返回本地,对二次查询该数据时,再去一级缓存中
根据id对比数据,该数据已存在,则将该数据组装成一个新对象返回,过程见下图。
(4)一级缓存的特性
特性:持久态会自动更新数据库
验证方式:根据id去查询一个记录,然后修改该记录,修改后不执行update()方法,提交事物。
验证代码:
@Test
public void Test7(){
SessionFactory sessionFactory = HibernateUtils.getFactory();
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
UserEntity userEntity1 = session.get(UserEntity.class, 2);
userEntity1.setPwd("asddfff");
tx.commit();
session.close();
sessionFactory.close();
}
验证结果:
该特性的原理与过程:
一级缓存在存储数据时会创建一个数据的快照,在提交事务时,会去对比缓存中数据和快照区的数据,如果数据不同,就会去更新数据
库的数据。
(5)Hibernate的二级缓存
- 默认关闭,需要通过配置文件配置才能开启。
- 目前已经放弃使用,使用redis技术替代。
- 使用的范围是sessionfactory的范围。
实体类的状态与Hibernate缓存的更多相关文章
- Hibernate_day02--课程安排_主键生成策略_对实体类crud操作_实体类对象状态
Hibernate_day02 上节内容 今天内容 实体类编写规则 Hibernate主键生成策略 实体类操作 对实体类crud操作 添加操作 根据id查询 修改操作 删除操作 实体类对象状态(概念) ...
- Hibernate第二天——实体类 与缓存机制
第二天,我们先来了解一下框架里的一个重要概念:实体类 实体类:把数据表或其它持久化数据的格式映射成的类,就是实体类. 实体类的编写规则:由于对应的是javabean,因而也遵循javabean的一些规 ...
- 06.Hibernate实体类生命周期
前言:Session接口是Hibernate向应用程序提供的操作数据库的主要接口,它提供了基本的增删查改方法,而且Session具有一个缓存它是Hibernate的一级缓存.站在持久化层的角度 ...
- Hibernate 缓存介绍
Hibernate中提供了两级缓存,一级缓存是Session级别的缓存,它属于事务范围的缓存,该级缓存由hibernate管理,应用程序无需干预:二级缓存是SessionFactory级别的缓存,该级 ...
- hibernate缓存机制详细分析 复制代码 内部资料 请勿转载 谢谢合作
您可以通过点击 右下角 的按钮 来对文章内容作出评价, 也可以通过左下方的 关注按钮 来关注我的博客的最新动态. 如果文章内容对您有帮助, 不要忘记点击右下角的 推荐按钮 来支持一下哦 如果您对文章内 ...
- hibernate缓存机制详细分析
转自:http://www.cnblogs.com/xiaoluo501395377/p/3377604.html 在本篇随笔里将会分析一下hibernate的缓存机制,包括一级缓存(session级 ...
- 10.hibernate缓存机制详细分析(转自xiaoluo501395377)
hibernate缓存机制详细分析 在本篇随笔里将会分析一下hibernate的缓存机制,包括一级缓存(session级别).二级缓存(sessionFactory级别)以及查询缓存,当然还要讨论 ...
- 【转载】hibernate缓存机制
一级缓存(session级别) 我们来看看hibernate提供的一级缓存 //此时会发出一条sql,将所有学生全部查询出来,并放到session的一级缓存当中.当再次查询学生信息时,会首先去缓存中看 ...
- hibernate缓存机制详细分析(一级、二级、查询缓存,非常清晰明白)
本篇随笔里将会分析一下hibernate的缓存机制,包括一级缓存(session级别).二级缓存(sessionFactory级别)以及查询缓存,当然还要讨论下我们的N+1的问题. 随笔虽长,但我相信 ...
随机推荐
- RobotFramework与Redis库连接
首先导入:RedisLibrary 具体写法 #连接Redis ${redis_conn} RedisLibrary.Connect To Redis ${DB_host} #获取验证码 ${smsV ...
- How to use the NFS Client c# Library
类库下载 I add a wiki page that explains how to use the NFS Client c# .net library in your project. Neko ...
- C#设计模式系列:代理模式(Proxy Pattren)
一.引言 在软件开发过程中,有些对象有时候会由于网络或者其他的障碍,以至于不能够或者不能直接访问到这些对象,如果直接访问对象给系统带来不必要的复杂性,这时候可以在客户端和目标对象之间增加一层中间层,让 ...
- Nginx自定义扩展模块
1. 概述 参考 Nginx开发HTTP模块入门 2. 扩展模块(假设根目录名称为nginx) nginx/configure文件中可以修改配置文件路径(编译时使用): 例如像把配置文件从默认的ngi ...
- Ubuntu16.04实用python脚本 - 启动nautilus(Gnome的文件管理器)!
nautilus是Gnome的图形的文件管理器,可以很方便管理各种文件,但是通常我们不是在root用户下,如果想在root下使用,必须在shell里面输入命令: sudo nautilus 这样做固然 ...
- 2.ECMAScript 5.0
JS的引入方式 内接式 <script type="text/javascript"> </script> 外接式 <!--相当于引入了某个模块--& ...
- MVC模式学习--雇员管理系统项目开发
1, 项目开发,使用原型开发, ① 开发流程: 需求分析->设计阶段->编码阶段->测试阶段->发布阶段/维护阶段 需求阶段:PM/项目经理 对客户 设计阶段:技术人员(架构师 ...
- [AIR] AIR将数据保存并导出为Excel
package { import flash.display.Sprite; import flash.events.MouseEvent; import flash.filesystem.File; ...
- Python 中当前位置以及目录文件遍历操作
Python 中当前位置以及目录文件遍历操作 当前位置 print(os.path.dirname(__file__)) 其中 dirname 会选择目录(文件夹),"__file__&qu ...
- 量化分析获取数据的3种姿势(压箱底的神器Tushare)
自打入门量化分析起,就有相当部分的时间在与数据打交道,从数据的获取.清洗到使用,对分析而言既是繁琐的,也是必须的.有大牛曾经说,量化分析有8成的开发时间都在处理数据. 为了节省时间,将更多精力投入到策 ...