Hibernate(四)之对象状态及一级缓存
一、Hibernate中的对象状态
1.1、瞬时态(临时态)
没有与Hibernate产生关联
与数据库中的记录没有产生关联(有关联就是与数据库中表的id相对应)
      获得:一般都只直接创建(new)
      瞬时态 转换 持久态
	        一般操作:save方法、saveOrUpdate
      瞬时态 转换 脱管态
	        一般操作:通过setId方法设置数据
1.2、持久态
Hibernate有关联
对象有id
      获得:
	        查询操作:get、loat、createQuery、createCriteria 等 获得都是持久态【】
	        执行save之后持久态
	        执行update之后持久态
      持久态 转换 瞬时态
	        官方规定执行delete()  --民间:删除态
      持久态 转换 脱管态
	        session没有记录
		        session.close () 关闭
		        session.clear() 清除所有
		        session.evict(obj) 清除指定的PO对象
1.3、游离态(脱管态)
没有与Hibernate产生关联
对象有ID
      获得:
	        创建、并设置OID的
	        通过api获得
      脱管态 转换 瞬时态
	        手动去除OID,设置成默认值
      脱管态 转换 持久态
	        一般操作:update()、saveOrUpdate
1.4、在代码中去查看三种状态
    
1.5、三种状态的相互转换
1.5.1、瞬时转化为持久
    
注意:如果主键生成策略中value是assigned需要自己指定主键,不指定会报错。
1.5.2、瞬时转化为游离
在数据库中id=1中已经存在有
        
        
1.5.3、持久转化为瞬时
      
方式二:
          
1.5.4、持久转化为游离
      
1.5.5、游离转化为瞬时
      
1.5.6、游离转化为持久
      
1.6、三种状态有什么用处?
持久状态,我们使用Hibernate主要是为了持久化我们的数据.
对于对象的状态,我们期望我们需要同步到数据库的数据,都被装换成持久状态
持久化状态特点: Hibernate会自动将持久化状态对象的变化同步到数据库中.
    
二、一级缓存
又称为session级别的缓存。当获得一次会话(session),hibernate在session中创建多个集合(map),用于存放操作数据(PO对象),为程序优化服务,
如果之后需要相应的数据,hibernate优先从session缓存中获取,如果有就使用;如果没有再查询数据库。当session关闭时,一级缓存销毁。
在Hibernate中存在两种缓存:一是线程级别的缓存(session缓存)二是进程级别的缓存(二级缓存)
缓存:用来提高效率的
session缓存:就是session对象中存在的缓存,缓存中存在的是(持久化)对象。
2.1、证明session缓存的存在
    
我们用图形来理解:
      
2.2、一级缓存快照
在从数据库取数据时,会将数据一式两份,一份作为缓存中的对象,一份作为快照,在session提交时做对比。
快照:与一级缓存一样的存放位置,对一级缓存数据备份。保证数据库的数据与 一级缓存的数据必须一致。如果一级缓存修改了,
在执行commit提交时,将自动刷新一级缓存,执行update语句,将一级缓存的数据更新到数据库。
        
举例:
      
我们画图来分析一下:
          
        
持久化状态: 本质就是存在缓存中的对象,就是持久化状态.
2.3、感受一级缓存带来的效率
感受一:
    
从上面这三行代码中,我们u1执行需要执行一条sql语句,我们执行得到u2和u3时,发现不会去再次查询,而是从缓存中找。
感受二:
        
从上面代码还在那个我们知道,第一个u1中会执行select语句。当事务还没有提交的时候,只会在缓存中进行。
所以总的只会产生两条sql语句。
2.4、一级缓存中的细节问题
问题一:保存对象时,可以使用save方法和persist方法,他们之间有区别吗?
没有区别,功能上是一样的。但persist(持久) 方法 来自于JPA 接口。而save(保存) 方法来自于Hibernate。
问题二:HQL查询是否会使用一级缓存?
HQL不会使用一级缓存.
    
问题三:HQL语句批量查询时,查询结果是否会进入缓存?
查询结果会放入缓存中
    
问题四:SQL查询 结果会不会放入1级缓存中?
如果把查询结果封装到对象中,对象会放入一级缓存
      
问题五:SQL查询 结果会不会放入1级缓存中?
没有把查询结果封装到对象中,对象不会放入一级缓存
          
问题六:criteria 会将查询结果放入一级缓存. 但是查询不会使用一级缓存. 与Hql查询结论一致.

Hibernate(四)之对象状态及一级缓存的更多相关文章
- hibernate学习(5)——对象状态与一级缓存
		
1.对象状态 1.1 状态介绍 hibernate 规定三种状态:瞬时态.持久态.脱管态 瞬时态:transient,session没有缓存对象,数据库也没有对应记录.没有与hibernate关联 ...
 - Hibernate第七篇【对象状态、一级缓存】
		
前言 本博文主要讲解Hibernate的细节-->对象的状态和一级缓存- 对象状态 Hibernate中对象的状态: - 临时/瞬时状态 - 持久化状态 - 游离状态 学习Hibernate的对 ...
 - Hibernate框架学习(三)——实体规则、对象状态、一级缓存
		
一.Hibernate中的实体规则 1.实体类创建的注意事项 1)持久化类提供无参数构造,因为在Hibernate的底层需要使用反射生成类的实例. 2)成员变量私有,提供公有的get和set方法,需提 ...
 - hibernate框架学习第三天:对象状态、一级缓存、快照等
		
对象的状态 瞬时状态: 瞬时对象(TO) 应用程序创建出来的对象,不受H3控制 注意:TO对象不具有OID,一旦为TO赋值OID,那么此时就不是TO 持久化状态:持久化对象(PO) 受H3控制的对象, ...
 - 【Hibernate】持久化对象状态及以及缓存
		
一.持久化类状态 1.1 三种持久化对象的状态 1.2 区分三种状态 1.3 三种状态对象转换 1.瞬时态 2.持久态 3.脱管态 4.持久态对象有自动更新数据库的能力 一.持久化类状态 1.1 三种 ...
 - Hibernate[延迟加载] [三种状态] [脏检查] [缓存机制]
		
一.持久化对象的唯一标识 java中按内存地址不同区分同一个类的不同对象,关系数据库用主键区分同一条记录,Hibernate使用OID来建立内存中的对象和数据库中记录的对应关系 什么是OID? 解析: ...
 - Hibernate中的对象状态,及自动更新原因
		
Hibernate的对象有三种状态,分别为:瞬时状态 (Transient). 持久化状态(Persistent).游离状态(Detached).对它的深入理解,才能更好的理解hibernate的运行 ...
 - Hibernate中的对象状态,及自动更新原因,Hibernate set对象后不调用update却自动更新
		
原文:http://www.cnblogs.com/xiaoda/p/3225617.html Hibernate的对象有三种状态,分别为:瞬时状态 (Transient). 持久化状态(Persis ...
 - hibernate学习(三) hibernate中的对象状态
		
hibernate对象的状态分为三种: 游离状态,持久化状态,瞬时状态 下面一行代码区分: Configuration cfg=new Configuration().configure(); ...
 
随机推荐
- linux-网络数据包抓取-tcpdump
			
用法格式: tcpdump [-i 网卡] [选项] '表达式' 选项说明如下: -i:interface 监听的网卡. -nn:表示以ip和port的方式显示来源主机和目的主机,而不是用主机名和 ...
 - ABP Zero 单部署,单数据库,多租户架构
			
首先,我们应该定义多租户系统中的两个条目: 租主(Host):租主是单例的(只有一个租主).租主会对创建和管理租户负责.因此,一个“租主用户”比所有的租户等级更高,并独立于所有租户,同时还能控制他们. ...
 - 简单聊聊HTTP/TCP/IP协议
			
经过几天的面试,有很多公司的面试官都会问到是否了解HTTP/TCP/IP协议? 一遇到这个问题,就一脸懵逼,虽然是计算机基层的东西,看来是必须得了解的,回到家之后,就查找了一些资料,整理了一篇博客,简 ...
 - Servlet的监听
			
Servlet监听 在<Servlet和Jsp>中我们使用了ServletConfig获取Servlet的初始配置,用ServletContext来获取整个Web应用的初始配置,但如果需要 ...
 - BOM基础(一)
			
学完了js的基础语法和DOM之后,就要要看看javascript中最后一项BOM了.BOM,全称brower document model,翻译过来就是浏览器对象模型.DOM是文档对象模型,属于BOM ...
 - CentOS 7安装配置FTP服务器
			
CentOS 7下FTP服务器的安装配置. 假设我们有以下要求 路径 权限 备注 /ftp/open 公司所有人员包括来宾均可以访问 只读 /ftp/private 仅允许Alice.Jack.Tom ...
 - std::copy性能分析与memmove机器级实现
			
复制数据的快速方法std::copy C++复制数据各种方法大家都会,很多时候我们都会用到std::copy这个STL函数,这个效率确实很不错,比我们一个一个元素复制或者用迭代器复制都来的要快很多. ...
 - elastic search 学习 一
			
初步阅读了elastic search 的文档,并使用command实践操作. 大概明白其概念模型.
 - WebX框架学习笔记之二----框架搭建及请求的发起和处理
			
框架搭建 执行环境:windows.maven 执行步骤: 1.新建一个目录,例如:D:\workspace.注意在盘符目录下是无法执行成功的. 2.执行如下命令: mvn archetype:gen ...
 - Java单例模式的各种实现(饿汉、懒汉、静态内部类、static代码块、enum枚举类型)
			
饿汉模式 饿汉模式就是立即加载,在方法调用前,实例就已经被创建了,所以是线程安全的. public class MyObject1 { private static MyObject1 myObjec ...