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表有这么一条记录:
//把数据放进cache
User 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()方便!
Hibernate第七篇【对象状态、一级缓存】的更多相关文章
- Hibernate-实体-对象状态-一级缓存-事务-查询
一 hibernate中的实体规则 1.1 实体类创建的注意事项 持久化类提供无参数构造 --在调用instance()方法时默认调用空参构造 成员变量私有,提供共有get/set方法 ...
- Hibernate学习笔记(二)—— 实体规则&对象的状态&一级缓存
一.持久化类 1.1 什么是持久化类? Hibernate是持久层的ORM映射框架,专注于数据的持久化工作.所谓的持久化,就是将内存中的数据永久存储到关系型数据库中.那么知道了什么是持久化,什么又是持 ...
- Hibernate 持久化对象和一级缓存
关于如何手动创建Hibernate,Hibernate初了解已经介绍了,接下来了解持久化对象和一级缓存. Hibernate的持久化类有三种状态: 1.Transient瞬时态:持久化对象没有唯一标识 ...
- Hibernate——(5)持久化对象和一级缓存机制
一.对象的三种状态 1.暂时态:当对象刚创建,和Session没有发生任何关系时,当程序运行完就即刻消失,被称为暂时态. 2.持久态:当执行如下代码时,对象变为持久态 Emp e = new Emp( ...
- 【JAVAEE学习笔记】hibernate02:实体规则、对象状态、缓存、事务、批量查询和实现客户列表显示
一.hibernate中的实体规则 实体类创建的注意事项 1.持久化类提供无参数构造 2.成员变量私有,提供共有get/set方法访问.需提供属性 3.持久化类中的属性,应尽量使用包装类型 4.持久化 ...
- JAVAEE学习——hibernate02:实体规则、对象状态、缓存、事务、批量查询和实现客户列表显示
一.hibernate中的实体规则 实体类创建的注意事项 1.持久化类提供无参数构造 2.成员变量私有,提供共有get/set方法访问.需提供属性 3.持久化类中的属性,应尽量使用包装类型 4.持久化 ...
- hibernate框架学习之对象状态
lHibernate对象共有三种状态 •瞬时状态:瞬时对象 •持久化状态:持久化对象 •托管状态:托管对象 l瞬时对象(Transient Object),简称TO l瞬时对象指的是应用程序创建出来的 ...
- Hibernate Session 4种对象状态
站在持久化的角度.Hibernate把对象分为4中状态. 临时状态. 持久化状态.游离状态.删除状态. 1:Save()方法: //这个是验证:1:save方法使临时对象------>变成持久化 ...
- [Nhibernate]一级缓存
目录 写在前面 文档与系列文章 一级缓存 一个例子 一级缓存管理 总结 写在前面 上篇文章介绍了nhibernate中对象的三种状态,通过对象的三种状态,很容易想到缓存. 什麽是缓存? 有时候,某些数 ...
随机推荐
- select、poll、epoll简介
epoll跟select都能提供多路I/O复用的解决方案.在现在的Linux内核里有都能够支持,其中epoll是Linux所特有,而select则应该是POSIX所规定,一般操作系统均有实现 sele ...
- NetBeans主题配色方案加设置.md
1.网上下载主题的地址是:http://netbeansthemes.com/ **上面的主题我看了下但是感觉不太适合自己所以自己就仿照的设置了下下面我附上自己的配置信息 感兴趣的可以下载下来自己看下 ...
- python中金额计算的小问题
由于二进制对浮点运算存在精度问题,所以一些浮点计算经常会出现以下情况: # -*- coding: utf-8 -*- a = 1 b = 0.9 print(a-b) 结果: 0.099999999 ...
- SpringMVC获取页面数据乱码的解决get/post
一.post请求方式的乱码 在web.xml中加入: <filter> <filter-name>CharacterEncodingFilter</filter-name ...
- 最大流isap模板
isap+bfs初始化+栈优化,点的编号从0开始: ; ; const int INF = 0x3f3f3f3f; struct Edge { int to, next, cap, flow; }ed ...
- Linux企业运维人员最常用150个命令汇总
命令 功能说明 线上查询及帮助命令(2个) man 查看命令帮助,命令的词典,更复杂的还有info,但不常用. help 查看Linux内置命令的帮助,比如cd命令. 文件和目录操作命令(18个) l ...
- 关于vue的一些总结
最近学习了一段时间的vue js 除了路由没用过之外 基本上其他的都用过了 对于vue的一些用法 在此做一个总结. 开始使用vue之前 需要导入vuejs这个文件到项目中 <scrip ...
- node.js的fs核心模块读写文件操作 -----由浅入深
node.js 里fs模块 常用的功能 实现文件的读写 目录的操作 - 同步和异步共存 ,有异步不用同步 - fs.readFile 都不能读取比运行内存大的文件,如果文件偏大也不会使用readFil ...
- [js高手之路]深入浅出webpack教程系列4-插件使用之html-webpack-plugin配置(上)
还记得我们上文中的index.html文件吗? 那里面的script标签还是写死的index.bundle.js文件,那么怎么把他们变成动态的index.html文件,这个动态生成的index.htm ...
- 编辑sass报错:error style.scss (Line 3: Invalid GBK character "\xE5")解决办法
cmd.exe /D /C call C:/Ruby23-x64/bin/scss.bat --no-cache --update header.scss:header.css error heade ...