hibernate中持久化对象的生命周期(三态:自由态,持久态,游离态 之间的转换)
三态的基本概念:
1, 暂时状态(Transient):也叫自由态,仅仅存在于内存中,而在数据库中没有对应数据。用new创建的对象,它没有持久化,没有处于Session中,处于此状态的对象叫暂时对象;
2, 持久化状态(Persistent):与session关联而且在数据库中有对应数据。已经持久化,增加到了Session缓存中。如通过hibernate语句保存的对象。处于此状态的对象叫持久对象;
3, 游离状态(Detached):持久化对象脱离了Session的对象。如Session缓存被清空的对象。
特点:已经持久化,但不在Session缓存中。处于此状态的对象叫游离对象;
|
×√ |
暂时状态 (Transient) |
持久化状态 (Persistent) |
游离状态 (Detached) |
|
是否处于Session缓存中 |
× |
√ |
× |
|
数据库中是否有相应记录 |
× |
√ |
√ |

游离对象和暂时对象异同:
两者都不会被Session关联,对象属性和数据库可能不一致;
游离对象有持久化对象关闭Session而转化而来,在内存中还有对象所以此时就变成游离状态了;
Hibernate和SQL的关系:
在操作了hibernate的方法如save()等后,并没有直接生成sql语句,去操作数据库,而是把这些更新存入Session中,仅仅有Session缓存要被更新时,底层的sql语句才干运行,数据存入数据库;
以下举例说明:
一,Session.save(user)执行机理。
1,把User对象增加缓存中,使它变成持久化对象;
2,选用映射文件指定的标识生成ID;
3,在Session清理缓存时候运行:在底层生成一个insert sql语句,把对象存入数据库;
注意:在你运行Session.save(user)后,在Session清理缓存前,假设你改动user对象属性值,那么终于存入数据库的值将是最后改动的值;此过程中ID不能被改动;
二,Session.delete(user)执行过程。
假设user是持久化对象,则运行删除操作,相同底层数据库的运行条件是:在Session清理缓存时候;
假设user是游离对象:
1,将user对象和Session关联,使之成为持久化对象;
2,然后依照user 是持久化对象的过程运行;
三态之间的转换方法:
①怎样成为自由态?对象通过构造方法成为自由态;持久态和游离态则通过session的delete方法成为自由态
②怎样成为持久态?对象能够由session的load或get方法直接成为持久态;自由态对象能够通过save,saveOrUpdate或persist方法成为持久态;游离态对象则能够通过update,saveOrUpdate成为持久态
③怎样成为游离态?游离态仅仅能由持久态转换而来,通过close或clear方法实现。
几种转换方法的对照:
1.get 与load
都是从数据库中载入数据封装为java对象,使得java对象从自由态直接变为持久态;
可是有两点差别:①get返回对象能够为null,load返回值则始终不为null,找不到时会抛异常②get即时运行insert,而load则是在使用此对象时才运行insert
2.save,update与saveOrUpdate
save是将自由态转为持久态,而update是将游离态转为持久态,saveOrUpdate能够说是两者的综合,它运行时先推断对象的状态(主要是通过有无主键推断的),若是自由态,则save,若是游离态,则update
3.save与persist
两者都是将对象由自由态转为持久态,但返回值不同:save返回主键值,而persist不返回
4,saveOrUpdate与merge
两者都是将自由态或游离态对象与数据库关联,但merge不改变对象的原有状态
此外,对clear与flush方法也作介绍。clear是将session中的对象所有变为游离态,是对象由持久态变为游离态的一种方法(第二种是关闭session);flush方法时为了使update操作能即时进行(正常情况下,仅仅有在事务关闭时才进行update操作)。
hibernate中持久化对象的生命周期(三态:自由态,持久态,游离态 之间的转换)的更多相关文章
- hibernate中持久化对象的生命周期(转载)
三态的基本概念 1, 临时状态(Transient):也叫自由态,只存在于内存中,而在数据库中没有相应数据.用new创建的对象,它没有持久化,没有处于Session中,处于此状态的对象叫临时对象: 2 ...
- Hibernate中Java对象的生命周期
一个对象的出生源于我们的一个new操作,当我们使用new语句创建一个对象,这个对象的生命周期就开始了,当我们不在有任何引用变量引用它,这个对象就的生命就此结束,它占用的内存就可以被JVM的垃圾回收器回 ...
- hibernate 持久化对象的生命周期 2.1
持久化对象的生命周期 瞬态(自由态) 表示对象在内存中存在,在数据库中没有数据相关,比如刚刚new出来的一个对象 持久态 持久态指的是持久化对象处于由Hibernate管理的状态,这种状态下持久化对象 ...
- hibernate 持久化对象的生命周期
持久化对象的生命周期 瞬态(自由态) 表示对象在内存中存在,在数据库中没有数据相关,比如刚刚new出来的一个对象 持久态 持久态指的是持久化对象处于由Hibernate管理的状态,这种状态下持久化对象 ...
- spring中Bean对象的生命周期
经过测试对于具体的一个Bean,执行的流程应该是: 1.实例化: 常见的有构造(有参.无参)实例化.静态工厂(方法是静态,通过类名.方法返回获取).实例工厂(专门有个类负责生产对象,需要在bean中配 ...
- hibernate中持久化对象的状态
持久化对象有以下几种状态: 临时对象(Transient): 在使用代理主键的情况下, OID 通常为 null 不处于 Session 的缓存中 在数据库中没有对应的记录 持久化对象(也叫”托管 ...
- Storm中重要对象的生命周期
Spout方法调用顺势 declareOutputFields()(调用一次) open() (调用一次) activate() (调用一次) nextTuple() (循环调用 ) deactiva ...
- Java 对象的生命周期
Java对象的生命周期 在Java中,对象的生命周期包含下面几个阶段: 1. 创建阶段(Created) 2. 应用阶段(In Use) 3. 不可见阶段(Invisib ...
- 第四章 Spring.Net 如何管理您的类___对象的生命周期链
各位,实在不好意思,因为有事,博客几天没更新了.前面有童鞋提到,配置 Objects.xml 路径的相关问题,这些东西是 IResource 接口的一些内容.在下一章会详细介绍. 传统的Net应用中, ...
随机推荐
- 使用ajax和history.pushState无刷新改变页面URL onpopstate(转)
Javascript代码 var htmlData1 = $.ajax( { url: "/getXXXResponse", async: false }).re ...
- 类集对enum的支持。
1,EmumMap public class EnumMap<K extends Enum<K>,V>extends AbstractMap<K,V>impleme ...
- iPhone不同机型适配 6/6plus --备用
机型变化 坐标:表示屏幕物理尺寸大小,坐标变大了,表示机器屏幕尺寸变大了: 像素:表示屏幕图片的大小,跟坐标之间有个对应关系,比如1:1或1:2等: ppi:代表屏幕物理大小到图片大小的比例值,如果 ...
- c/c++ 传统数组的缺点
专题: 动态内存分配 (所有高级语言,没有C里深刻) 传统数组的缺点: 1.数组长度必须事先指定,而且只能是常整数,不能是变量 例子 ]; //必须事先指定,而且只能是常整数 ; int a ...
- HttpWebRequest提高效率之连接数,代理,自动跳转,gzip请求等设置问题
先设置4个: [csharp] webrequest.ServicePoint.Expect100Continue = false; //是否使用 Nagle 不使用 提高效率 webrequest. ...
- backbone csdn
http://blog.csdn.net/the_fire/article/details/7444067 blog.csdn.net/the_fire/article/details/7445448 ...
- Spring中的事务管理详解
在这里主要介绍Spring对事务管理的一些理论知识,实战方面参考上一篇博文: http://www.cnblogs.com/longshiyVip/p/5061547.html 1. 事务简介: 事务 ...
- 【Xamarin 挖墙脚系列:IOS 开发界面的3种方式】
原文:[Xamarin 挖墙脚系列:IOS 开发界面的3种方式] xcode6进行三种基本的界面布局的方法,分别是手写UI,xib和storyboard.手写UI是最早进行UI界面布局的方法,优点是灵 ...
- Javascript水平提升
1,学习js分几个阶段,没入门,入门初学者,中级水平,高级水平,ppt水平. 2,没入门的如何学习? 我当初是先学jquery,有css和html基础,有css基础看jq的语法很简单,就是选择符,jq ...
- Android之sqlite 命令
1.数据库.表的建立,记录的添加.查询.修改和删除 F:">sqlite3 database.dbsqlite> create table admin(username text ...