菜鸟学SSH(八)——Hibernate对象的三种状态
前面写了几篇关于SSH的博客,但不是Struts就是Spring,Hibernate还从来没写过呢。说好是SSH的,怎么可以光写那两个,而不写Hibernate呢对吧。今天就先说说Hibernate对象的三种状态,Hibernate对象有三种状态,分别是:临时态(Transient)、 持久态(Persistent)、游离态(Detached)。
临时状态:是指从对象通过new语句创建到被持久化之前的状态,此时对象不在Session的缓存中。
处在此状态的对象具备以下特点:
1,不在Session缓存中,不与任何Session实例相关联。
2,在数据库中没有与之对应的记录。
通常在下列情况下对象会进入临时状态:
1,通过new语句创建新对象。
2,执行delete()方法,对于游离状态的对象,delete()方法会将其与数据库中对应的记录删除;而对于持久化状态的对象,delete()方法会将其与数据库中对应的记录删除,并将其在Session缓存中删除。
例如:Object object = new Object();
此时object为临时状态,数据库中没有对应的数据,Session缓存中也没有相关联的实例。
持久化状态:是指对象被持久化到Session对象被销毁之前的状态,此时对象在Session的缓存中。
处在此状态的对象具备以下特点:
1,在Session缓存中,与Session实例相关联。
2,在数据库中有与之对应的记录。
3,Session在清理缓存的时候,会根据持久化对象的属性变化更新数据库。
通常在下列情况下对象会进入临时状态:
1,执行save()或saveOrUpdate()方法,使临时对象转变为持久化对象。
2,执行upda()或saveOrUpdate()方法,使游离对象转变为持久化对象。
3,执行load()或get()方法,返回的对象都是持久化对象。
4,执行find()方法,返回List集合中存放的都是持久化对象。
5,在允许级联保存的情况下,Session在清理缓存时会把与持久化对象关联的临时对象转变为持久化对象。
例如:Session session = factory.openSession(); object.setName("持久化对象"); session.save(object);
此时object对象为持久化对象,Session缓存中有相关联的实例,数据库中有相应的记录。
游离状态:是指从持久化对象的Session对象被销毁到该对象消失之前的状态,此时对象不在Session的缓存中。
处在此状态的对象具备以下特点:
1,不在Session缓存中,不与任何Session实例相关联。
2,在数据库中有与之对应的记录(前提是没有其他Session实例删除该条记录)。
通常在下列情况下对象会进入临时状态:
1,执行close()方法,将Session缓存清空,缓存中的所有持久化对象将转变成游离对象。
2,执行evict()方法,能从缓存中删除一个持久化对象,使之转变成游离对象。
例如:session.close();
此时上文的object对象为游离对象,Session缓存中没有有相关联的实例,数据库中有相应的记录。
三种状态之间的转换过程
对上图的解析:
1,当一个对象被new了以后此对象处于临时态(Transient)。
2,然后对此对象执行session的save() 或者saveOrUpdate()方法后,此对象被放入session的一级缓存进入持久态。
2,当再对此对象执行evict()/close()/clear()的操作后此对象进入游离态(Detached)。
4,游离态(Detached)和临时态(Transient)的对象由于没有被session管理会在适当的时机被java的垃圾回收站(garbage)回收。
5,执行session的get()/load()/find()/iternte()等方法从数据库里查询的到的对象,处于持久态(Persistent)。
6,当对数据库中的纪录进行update()/saveOrUpdate()/lock()操作后游离态的对象就过渡到持久态。
7,处于持久态(Persistent)与游离态(Detached)的对象在数据库中都有对应的记录。
8,临时态(Transient)与游离态(Detached)的对象都可以被回收可是临时态的对象在数据库中没有对应的纪录,而游离态的对象在数据库中有对用的纪录。
三种状态在程序的转换过程:
|
代码 |
对象的生命周期状态 |
对象的状态 |
|
Object object = new Object(); |
开始生命周期 |
开始生命周期 |
|
Session session = factory.openSession(); |
在生命周期中 |
临时状态 |
|
session.save(object); |
在生命周期中 |
转变为持久化状态 |
|
tx.commit(); |
在生命周期中 |
持久化状态 |
|
session.close(); |
在生命周期中 |
转变为游离状态 |
|
System.out.println(object.getName()); |
在生命周期中 |
游离状态 |
|
object = null; |
结束生命周期 |
结束生命周期 |
三种状态里面,只有持久化状态在Session缓存中有相关联的实例,临时状态跟游离状态都没有。临时状态数据库里没有对应的记录,其他两种可能又记录,也可能没有记录。
好了,Hibernate对象的三种状态就说到这里,接下来可能跟大家说说Hibernate的Session,期待不?
菜鸟学SSH(八)——Hibernate对象的三种状态的更多相关文章
- hibernate对象的三种状态
对于hibernate,我想不在这里讲解了,我们就直接进入主题 在这里我将要说的是"hibernate对象的三种状态",对象是我们十分熟悉的,对吧!而对于对象它有三种状态 分别是瞬 ...
- Hibernate 对象的三种状态
hibernate对象的三种状态: (一) 瞬时(临时)状态: 对象被创建时的状态,数据库里面没有与之对应的记录! (二) 持久状态: 处于session的管理中,并且数据库里面存在与之对应的 ...
- HIbernate学习笔记(二) hibernate对象的三种状态与核心开发接口
1.在hibernate中持久化对象有三个状态,这个面试时可能会问到: (1)transient瞬时态:在数据库中没有与之匹配的数据,一般就是只new出了这个对象,并且在session缓存中也没有即此 ...
- hibernate操纵数据库常用方法 及 hibernate对象的三种状态
在dao层使用hibernate语言来与数据库进行访问,hibernate作为面向对象思想开发的dao层框架其理解也需要以面向对象的思想来看待 使用.hibernate不仅支持使用者使用他提供的对象来 ...
- Hibernate对象的三种状态,瞬时态、持久态、游离态
1.瞬时态.(new完一个对象,突然断电,内存中没有此对象) hibernate中什么时候的对象为瞬时态呢,当我们new 一个对象时,还没有save时,它就是瞬时态的,当我们delete一个对象时,它 ...
- hibernate对象的三种状态及转换
一.hibernate对象三种状态 Transient(瞬时状态):没有session管理,同时数据库没有对应记录 举例:new 出来的对象还没有被session管理,此时该对象处于Transient ...
- [转]Hibernate对象的三种状态
在Hibernate中,对象有三种状态:临 时状态(Transient).持久状态(Persistent)和游离状态(Detached). 处于持久态的对象也称为 PO(PersistenceObje ...
- 分享知识-快乐自己:Hibernate对象的三种状态
图解: 1):瞬时状态(Transient) 对象与session没有关联,数据库中没有对应的数据. 一般new出来的对象便是瞬时对象. 对瞬时对象使用save()方法便使之成为持久对象. 由于数据库 ...
- Hibernate(六)__对象的三种状态
瞬时(transient):数据库中没有数据与之对应,超过作用域会被JVM垃圾回收器回收,一般是new出来且与session没有关联的对象. 持久(persistent):数据库中有数据与之对应,当前 ...
随机推荐
- Eclipse和MyEclipse使用技巧--如何解决新建一个包的时候,工具帮生成了多个包的问题?
一.问题再现 二.如何解决
- 在Java中使用Kafka
Producer部分 Producer在实例化后, 对外提供send方法, 用于将数据送到指定的topic和partition; 以及在退出时需要的destroy方法. 接口 KafkaProduce ...
- Ubuntu18.04, WPS表格生成中文大写数字的script
=IF(ROUND(J9,2)<0,"无效数值",IF(ROUND(J9,2)=0,"零",IF(ROUND(J9,2)<1,"" ...
- 适配新路由3(D2)的LEDE/OpenWrt固件
使用MediaTek系列的芯片方案 Y1(R6830): MT7620A + MT7612EN(5G 866M) + winbond 25Q128FVFG + winbond W971GG6KB-25 ...
- hihocoder234周 计算不包含黑点的矩形个数
题目链接 问题描述 一个棋盘有n条横线,m条竖线,上面有k个黑点,问有多少个不包含黑点的矩形. 数据范围: n和m最大为1000,k最大为10 方法一:动态规划 复杂度n*m*k. import ja ...
- linux shell 脚本攻略学习11--mkdir和touch命令详解
一.创建目录(mkdir命令详解) amosli@amosli-pc:~/learn$ mkdir dir amosli@amosli-pc:~/learn/dir$ mkdir folder amo ...
- HDU 1907 John (Nim博弈)
John Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Submis ...
- Redis踩过的坑
现象:在使用redis云提供的redis服务后,经常出现connect timeout: redis.clients.jedis.exceptions.JedisConnectionException ...
- 高并发分布式系统中生成全局唯一(订单号)Id js返回上一页并刷新、返回上一页、自动刷新页面 父页面操作嵌套iframe子页面的HTML标签元素 .net判断System.Data.DataRow中是否包含某列 .Net使用system.Security.Cryptography.RNGCryptoServiceProvider类与System.Random类生成随机数
高并发分布式系统中生成全局唯一(订单号)Id 1.GUID数据因毫无规律可言造成索引效率低下,影响了系统的性能,那么通过组合的方式,保留GUID的10个字节,用另6个字节表示GUID生成的时间(D ...
- svn搭建本地服务端
使用VisualSVN Server来完成,下载地址:https://www.visualsvn.com/server/download/ 我安装的版本是3.3.1,安装的时候选择了标准版本,另外一个 ...