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…

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

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

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

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

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

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

java launcher 下载_Java Launcher下载并安装

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

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

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

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指定管理员图…

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 家庭版和专业版等此前为…

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

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

Struts2内置拦截器和自定义拦截器

内置拦截器 Struts2中内置类许多的拦截器,它们提供了许多Struts2的核心功能和可选的高级特性。这些内置的拦截器在struts-default.xml中配置。只有配置了拦截器,拦截器才可以正常的工作和运行。Struts 2已经为您提供丰富多样的,功能齐全的拦截…

基于eclipse RCP的文件夹管理工具

总的来说, Windows7的文件夹浏览器已经提供了很好的功能, 但是也有一些鞭长莫及的地方,比如: 无法搜索指定文件夹里面某些文件夹的文件我将经常使用的图标资源分成几个目录存放于一个文件夹中, 这些资源风格不同,来源也不同. 有些是来自开源项目的, 有些是来自iconfinder, 还有…

.NET 6新特性试用 | 异步流

前言IAsyncEnumerable<T>支持返回异步迭代的枚举器&#xff0c;但在.NET 6之前&#xff0c;即使在API中使用了IAsyncEnumerable<T>&#xff0c;它还是使用同步方式输出&#xff0c;首先将结果缓冲到内存中&#xff0c;然后再写入响应中&#xff1a;[HttpGet] publi…

今日份凡尔赛培训满分了没?

1 今日份凡尔赛培训又精进了&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 西班牙修复失败的雕像▼3 这裤子长的过分了&#xff01;▼4 一般人肯定问不出的问题▼5 令人无语的重婚案&#xff08;via.头条新闻&#xff09;▼6 孩子你太精了些▼7 哦吼&#xf…

WEB服务器 - Apache、Nnginx、Lighttpd的比较和择优(转)

Apache服务器和nginx的优缺点&#xff1a; 我们之前大量使用Apache来作为HTTPServer。 Apache具有很优秀的性能&#xff0c;而且通过模块可以提供各种丰富的功能。 优点&#xff1a; 首先Apache对客户端的响应是支持并发的 &#xff0c;运行httpd这个daemon进程之后&#x…

万万没想到,一个 MongoDB.Driver 的 bug 导致 .NET5 程序死锁!

一&#xff1a;背景 1. 讲故事这个月初&#xff0c;星球里的一位朋友找到我&#xff0c;说他的程序出现了死锁&#xff0c;怀疑是自己的某些写法导致mongodb出现了如此尴尬的情况&#xff0c;截图如下&#xff1a;说实话&#xff0c;看过这么多dump&#xff0c;还是第一次遇到真…

有生之年必看!原来历史还可以这样震撼,看完我惊呆了...

▲点击查看哈佛大学本杰明教授曾说&#xff1a;“越是到了高等教育的阶段&#xff0c;人们就越重视从历史中总结经验&#xff0c;尤其是精英阶段。很多人都想好好读读历史&#xff0c;但是一直以来&#xff0c;读历史都有一个问题&#xff1a;看着满满都是字的大部头&#xff0…

.NET6 新功能和新生态

微软中国MSDN 点击上方蓝字关注我们.NET 6正式推出已有一周多的时间&#xff0c;不少小伙伴已经安装好开始尝鲜了。围绕着.NET 6&#xff0c;开发者大佬们已经为大家讲解了不少新功能和新生态。但是&#xff01;我们这里还有更多你可能感兴趣的最新消息&#xff0c;今天就让我…