问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

在hibernate中java对象有哪些状态

发布网友 发布时间:2022-04-13 21:20

我来回答

1个回答

热心网友 时间:2022-04-13 22:49

瞬时状态(Transient)

通过new创建对象后,对象并没有立刻持久化,它并未与数据库中的数据有任何关联,此时Java对象的状态为瞬时状态。

Session对于瞬时状态的Java对象是一无所知的,当对象不再被其他对象引用时,它的所有数据也就丢失了,对象将会被Java虚拟机按照垃圾回收机制处理。

持久状态(Persistent)

当对象与Session关联,被Session管理时,它就处于持久状态。处于持久状态的对象拥有数据库标识(数据库中的主键值)。

那么,对象是什么时候与Session发生关联的呢?有两种方法:

第一种,通过Sesison的查询接口,或者get()方法,或者load()方法从数据库中加载对象的时候,加载的对象是与数据库表中的一条记录关联的,此时对象与加载它的Session发生关联;

第二种,瞬时状态的对象,通过Session的save()方法或SaveOrUpdate()方法时,Java对象也与Session发生关联。

对于处于持久状态的对象,Session会持续跟踪和管理它们,如果对象的内部状态发生了任何变更,Hibernate会选择合适的时机(如事务提交时)将变更固化到数据库中。

游离状态

处于持久状态的对象,脱离与其关联的nSession的管理后,对象就处于游离状态。

处于游离状态的对象,Session无法保证对象所包含的数据与数据库中的记录一直,因为Hibernate已经无法感知对该对象的任何操作。

Session提供了两个方法(update()、merge()),将处于游离状态的对象,与一个新的Session发生关联。

此时,对象的状态就从游离状态重新转换为持久状态。

2.三种状态之间的转换:

使用new关键字构件对象,该对象的状态是瞬时状态。

1 .瞬时状态转为持久状态

使用Session对象的save()或saveOrUpdate()方法保存对象后,该对象的状态由瞬时状态转换为持久状态。

使用Session对象的get()或load()方法获取对象,该对象的状态是持久状态。

2. 持久状态转为瞬时状态

执行Session对象的delete()方法后,对象由原来的持久状态变为瞬时状态,因为此时该对象没有与任何的数据库数据关联。

3. 持久状态转为游离状态

执行了Session对象的evict()、clear()或close()方法,对象由原来的持久状态转为游离状态。

4 .游离状态转为持久状态

重新获取Session对象,执行Session对象的update()或saveOrUpdate()方法,对象由游离状态转为持久状态,该对象再次与Session对象相关联。

5. 游离状态转为瞬时状态

执行Session对象的delete()方法,对象由游离状态转为瞬时状态。

处于瞬时状态或游离状态的对象不再被其他对象引用时,会被Java虚拟机按照垃圾回收机制处理。

3.Hibernate中get()和load()区别

当使用Session的get()方法时,如果加载的数据不存在,get()方法会返回一个NULL;但是使用load()方法,若加载的数据不存在,则会抛出异常。

一.load加载方式

当使用load方法来得到一个对象时,此时hibernate会使用延迟加载的机制来加载这个对象,即:当我们使用session.load()方法来加载一个对象时,此时并不会发出sql语句,当前得到的这个对象其实是一个代理对象,这个代理对象只保存了实体对象的id值,只有当我们要使用这个对象,得到其它属性时,这个时候才会发出sql语句,从数据库中去查询我们的对象。

Session session = HibernateUtil.currentSession();
Transaction tx=session.beginTransaction();
Dept dept = (Dept)session.load(Dept.class,1);
System.out.println(dept);
通过load的方式加载对象时,会使用延迟加载机制,此时得到的User对象其实是一个
代理对象,该代理对象里面仅仅只有id这个属性

二、get加载方式

相对于load的延迟加载方式,get就直接的多,当我们使用session.get()方法来得到一个对象时,不管我们使不使用这个对象,此时都会发出sql语句去从数据库中查询出来:

Session session = HibernateUtil.currentSession();
Transaction tx=session.beginTransaction();
// 通过get方法来加载对象时,不管使不使用该对象,都会发出sql语句,
//从数据库中查询
Dept dept = (Dept)session.get(Dept.class,1);
System.out.println(dept);

因此我们可以看到,使用load的加载方式比get的加载方式性能要好一些,因为load加载时,得到的只是一个代理对象,当真正需要使用这个对象时再去从数据库中查询。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
从焦作市到郑州快递一个羽毛球拍需用多少钱 iPhone X还能坚挺两年,升级到ios 15发热严重要靠红魔冰磁散热器 Peltier Module散热方式 一加18W冰点散热背夹-超强散热,极速降温 2015年春晚有哪些明星 新闻 如何评价央视主持人朱军?以及如何评价朱军所主持的《艺术 纯粮食白酒品牌大全,让你喝得放心(真正的纯粮食白酒有哪些品牌)_百度... ...工作单位要辞退并提出会给出相应赔偿,但合同马上到期,如到期后... ABC外语培训学校ABC教育集团总裁——刘成 abc是国产品牌吗?口碑如何? 体检前一晚上吃会影响吗 体检前一天晚上11点可以吃泡面吗 体检前一天晚上可以吃什么东西 体检前一天晚上是不是不能吃油腻和肉类的东西 高考体检前一天可以吃东西吗 体检前一天晚上不能吃饭么 体检头天晚上可以吃东西喝水吗 正规体检前一天晚上能吃饭和喝水吗 最好几点之后不要喝水了 体检前一天晚上吃了东西会怎么样 体检的前一天晚上9点过后就不能吃东西了吗?还是晚上12点?求人详细解说。给分。 体检头一天晚上10点还能不能吃东西 体检前一天晚上可以不吃饭吗? 体检前一天晚上能吃东西吗 第二天体检前一天晚上能吃东西吗 体检的前一天晚上能吃饭吗? 系统盘不是C盘,能不能改成C盘? 现在什么防火墙比较好 谁能介绍一款好的防火墙!!! 环贸iapm商场的商场设计 上海环贸iapm商场,iapm是什么意思? 华为荣耀V30为什么用不了万能? 戴尔笔记本电脑win10,开机之后出现这个画面,跳过之后电脑又卡的不行,任何一个软件都打不开 如何修改密码 不小心删除了戴尔电脑里C盘文件夹,导致的笔记本电脑所有的软件包括浏览器和卫士都打不开,该怎么办? dnf女圣职者有几个职业 dnf圣职者的几个职业怎么分大叔…四叔! 戴尔笔记本软件打不开怎么办 戴尔电脑出现Dell SupportAssist重启电脑后所有应用程序都无法启动 DNF圣职者四个职业哪个角色好玩,玩家多,各个优点缺点! dnf中有多少个职业. DNF圣职者转职有几个职业 win7怎么关闭休眠功能 jar 包在tomcat下怎么运行 Java工程打包jar,里面有一个main函数,怎么用Tomcat执行main函数呢?这个main函数的类继承Runnable tomcat 怎么在启动的时候自动运行jar 对象在 hibernate session 中的生命周期有几种状态 苹果手机和安卓手机可以用一个帐号登录吗? 为什么买回来的榴莲打开后吃起来是脆脆的,也不臭,这是为什么 我的榴莲肉为什么是脆的 商票承兑提示付款后七日付款会影响信用吗