Hibernate 对象的三种状态

Hibernate 对象的三种状态

瞬时(transient):

由new操作符创建,且尚未与Hibernate Session关联的对象被认定为瞬时(Transient)的。瞬时(Transient)对象不会被持久化到数据库中,也不会被赋予持久化标识(identifier)。如果瞬时(Transient)对象在程序中没有被引用,它会被垃圾回收器(garbage collector)销毁。使用Hibernate Session可以将其变为持久(Persistent)状态。(Hibernate会自动执行必要的SQL语句)。

瞬时状态的特点有:

1、 与数据库中的记录没有任何关联,也就是没有与其相关联的数据库记录。

2、 与Session没有任何关系,也就是没有通过Session对象的实例对其进行任何持久化的操作。

举例:

User user=new User(); //user是一个瞬时对象,在数据库的表中是没有记录和该对象相对应的。和session没有关系。

user.setName(“ddd”);

user.setBirthday(new Date());

session.save(user); //持久化状态

持久(persistent

数据库中有数据与之对应,当前与session有关联,并且相关联的session没有关闭,事务没有提交;持久对象状态发生改变,在事务提交时会影响到数据(Hibernate能检测到)。

持久(Persistent)是实例在数据库中有对应的记录,并拥有一个持久化标识(identifier)。持久(Persistent)的实例可能是刚被保存的,或刚被加载的,无论哪一种,按定义,它存在于相关联的Session作用范围内。Hibernate会检测到处于持久(Persistent)状态的对象的任何改动,在当前操作单元(unit of work)执行完毕时将对象数据(state)与数据库同步(synchronize)。开发者不需要手动执行Update。将对象从持久(Persistent)状态编程瞬时(Transient)状态同样也不需要手动执行delete语句。

持久对象具有如下特点:

1、 和session实例关联;

2、 在数据库中有与之关联的记录。

3、 Hibernate会根据持久态对象的属性的变化而改变数据库中的相应记录。

举例:

Session session = factory.openSession();Transaction tx = session.beginTransaction();session.save(stu); // persistent持久化状态System.out.println(stu);tx.commit();session.close(); //执行close()方法之后,就会由持久对象转换成脱管对象System.out.println(stu); // 脱管对象

脱管/游离(detached):数据库中有数据与之对应,但没有session与之关联,脱管对象状态发生改变,hibernate不能检测到。

脱管状态:

与持久(Persistent)状态对象关联的Session被关闭后,对象就变为脱管(Detached)的。对脱管(Detached)对象的引用依然有效,对象可继续被修改。脱管(Detached)对象如果重新关联到某个新的Session上,会再次转变为持久(Transistent)的(在脱管Detached其间的改动将被持久化到数据库)。这个功能使得一种编程模型,即中间会给用户思考时间(user think-time)的长时间运行的操作单元(unit of work).

脱管对象拥有数据库的识别值,可通过update()、saveOrUpdate()等方法,转变成持久对象。

脱管对象具有如下特点:

1、 本质上与瞬时对象相同,在没有任何变量引用它时,JVM会在适当的时候将它回收;

2、 比瞬时对象多了一个数据库记录标识值。

3、 不在于Session相关联。

4、 脱管对象一定是由持久态对象转化而来。

首先是我们的UML图转换:以及解析:


对以上图形的解析:

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)的对象都可以被回收可是瞬时态的对象在数据库中没有对应的纪录,而游离态的对象在数据库中有对用的纪录。

1、操纵持久化对象-save()

(1)Session 的 save() 方法使一个临时对象转变为持久化对象

(2)Session 的 save() 方法完成以下操作:

(3)把 News 对象加入到 Session 缓存中, 使它进入持久化状态

(4)选用映射文件指定的标识符生成器, 为持久化对象分配唯一的 OID. 在使用代理主键的情况下, setId() 方法为 News 对象设置 OID 使无效的.

(5)计划执行一条 insert 语句,把Customer对象当前的属性值组装到insert语句中

(6)Hibernate 通过持久化对象的 OID 来维持它和数据库相关记录的对应关系. 当 News 对象处于持久化状态时, 不允许程序随意修改它的 ID

2、 操纵持久化对象-update()

(1)Session 的 update() 方法使一个游离对象转变为持久化对象, 并且计划执行一条 update 语句.


3、操纵持久化对象-saveOrupdate()

saveOrUpdate:

该方法同时包含save和update方法,如果参数是临时对象就用save方

法,如果是游离对象就用update方法,如果是持久化对象就直接返回。

如果参数是临时对象就用save方法


如果是游离对象就用update方法


如果是持久化对象就直接返回,不执行操作






本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/295361.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

升级Jenkins镜像,支持.NET6.0

(寒天催日短,风浪与云平)书接上文,上回咱们说到了《【Blog.Core开源】完成升级.NET 6.0》,只是代码层面的升级,今天趁着周末正好把生产环境也升级下(大家可以酌情升级哟)。过程很简单…

女朋友来大姨妈怎么办?

1 医生的工伤怎么算?(素材来源网络,侵删)▼2 大风车呀吱悠悠的转!(via:草多南)▼3 买了个丑酸奶!▼4 和老爸讨论谈恋爱(via:张子乐_&#xff0…

[转]android 获取手机GSM/CDMA信号信息

本文转自:http://software.intel.com/zh-cn/blogs/2011/12/16/android-gsmcdma/ 在Android中我们常用的轻松获取WIFI信号列表,那如何获取CDMA或者GSM的手机信号呢?系统提供了TelephonyManager类,此类非常丰富,基本你所…

数码管流动显示(自己的单片机)

/********************************************************************************** * 标题: 试验数码管上显示数字( 单片机直接实现位选 共阴极) * * * * …

Hibernate懒加载

在Hibernate框架中,当我们要访问的数据量过大时,明显用缓存不太合适, 因为内存容量有限 ,为了减少并发量,减少系统资源的消耗,这时Hibernate用懒加载机制来弥补这种缺陷,但是这只是弥补而不是用…

迪拜“烧掉800亿”造了座烂尾岛,奇葩建筑惊呆网友:有钱人的世界,我不懂!

全世界只有3.14 % 的人关注了爆炸吧知识来源:普象工业设计小站天呐!最新消息阿布扎比酋长国又发现220亿桶非常规可采石油让原本富有的国家更加钱上有钱尤其是它的兄弟国——迪拜简直“豪”无人性耗资800亿美元的“世界岛”惨成全球最大烂尾项目竟没有表示…

英特尔收购威盛X86业务 兆芯何去何从

日前,英特尔公司以1.25亿美元收购威盛麾下Centaur 公司的x86业务。Centaur 是威盛的一家子公司,20多年前,威盛依靠数笔收购获得了x86授权,开发了数款X86芯片,由于性能与英特尔和AMD差距太大,威盛的X86 CPU在…

.net中的mapinfo开发:准备(一)

最近开发一个项目,用到了mapinfo的开发,所以想把自己研究的一些东西记录下来,一则供自己使用,二则供一些同道中的朋友参考,有什么不当之处,请提示,再做修改。 首先要了解一下mapinfo的基本概念&…

研究生计划-心得征程

以前定过一个计划,现在觉得有必要在重新规划一次,毕竟见识和认识有深了 1、编译原理,前些天是把数据结构写完了,编译原理也一直没看,所以下一步深入学习编译原理 2、学习PHP框架,像wordpress和yii,PHP也算入…

java launcher 下载_Java Launcher下载并安装

通过双击资源管理器中的类文件来运行Java程序,并创建一个EXE和可执行的JAR文件Java启动器通过双击类文件来运行Java应用程序和小程序. 通过右键单击以图形格式查看类源代码和类层次结构;显示jar和zip文件的内容java下载安装,而不是通过右键单…

自带数据线的迷你数显充电宝,好用到哭

▲ 点击查看无论是付钱办事坐车,还是游戏追剧闲聊,有个手机就够了啊~这也就导致了,出门最怕的不是没带钱,而是带了手机却没电了。手机没电!这简直能要了老命啊!幸好有充电宝“续命”!但每回在打…

值得永久收藏的 C# 设计模式套路(二)

设计模式套路,第二弹。在第一篇中,主要写了创造模式相关的几种套路。如果你是刚看到这个文章,建议你先去看看第一篇 传送门。这一篇,我们说说结构模式相关的套路。结构模式,主要作用是将类型、对象和其它内容放在一起&…

VmWare5.5主机Citrix桌面实施方案(二)

三、配置数据库服务器安装数据库服务器分别在三台机器上安装SQL2008运行安装程序图示3.1点击确定继续图示3.2使用全新安装图示3.3图示3.4输入密钥继续图示3.5接受条款图示3.6进行安装图示3.7图示3.8图示3.9图示3.10图示3.11图示3.12图示3.13指定启动SQL账户图示3.14指定管理员图…

sql查询从m到n的这几条记录

查询从m到n的这几条记录 m-ngoselect top (n-m1) * from stu where id not in (select top (m-1) ID from stu ) --51-100select top 50 * from stu where id not in (select top 50 ID from stu )转载于:https://www.cnblogs.com/kuang/archive/2012/07/19/2599344.html

enmu枚举类型

在实际问题中,有些变量的取值被限定在一个有限的范围内。例如,一个星期内只有七天,一年只有十二个月,一个班每周有六门课程等等。如果把这些量说明为整型,字符型或其它类型显然是不妥当的。为此,C语言提供了…

java定义接口_一文知道Java中接口的定义

使用interface来定义一个接口。接口定义同类的定义类似,也是分为接口的声明和接口体,其中接口体由常量定义和方法定义两部分组成。定义接口的基本格式如下:方法:接口中的方法只有定义而没有被实现。1.接口是一组行为的规范、定义&…

告诉你一个可怕的数学事实:公路越多,城市越堵!

全世界只有3.14 % 的人关注了爆炸吧知识生活依旧美好上周,刘强西带着小天到附近的清扬山放松一下。然而,从京西大旅馆有两条路可以到清扬山。一条是金龙大道,前半程走完需要20分钟,但可怕的是路窄,车辆一多就慢&#x…

官方精简版!Windows 10 LTSC 2021 正式发布

微软现已正式发布 Windows 10 企业版 LTSC 2021。LTSC 全称为 the Long-Term Servicing Channel,即长期服务频道。使用 LTSC 服务模型,Windows 10 电脑可以延迟接收功能更新,功能更新每 2-3 年(Windows 10 家庭版和专业版等此前为…

完全卸载mysql数据库图文教程

见:http://jingyan.baidu.com/article/f96699bbaa8fc1894f3c1b5a.html

不喜欢写测试的朋友看过来,与你分享写测试的经验 做一个爱写测试的程序员...

自从掌握了单元测试的要领之后,经常写测试,做测试,也非常喜欢做单元测试。我的文章《数据采集:完美下载淘宝Ip数据库 简单的程序节省60元人民币而不必购买数据库》中的代码,也是个测试方法,源代码在QQ群中公…