java对象的状态由什么表示_持久化层的Java对象可处于哪些状态?这些状态有哪些特征?...
当应用程序通过new语句创建了一个对象,这个对象的生命周期就开始了,当不再有任何引用变量引用它,这个对象就结束生命周期,它占用的内存就可以被JVM的垃圾回收器回收。对于需要被持久化的Java对象,在它的生命周期中,可处于以下三个状态之一:
(1) 临时状态(transient):刚刚用new语句创建,还没有被持久化,不处于Session的缓存中。处于临时状态的Java对象被称为临时对象。
(2) 持久化状态(persistent):已经被持久化,加入到Session的缓存中。处于持久化状态的Java对象被称为持久化对象。
(3) 游离状态(detached):已经被持久化,但不再处于Session的缓存中。处于游离状态的Java对象被称为游离对象。
图1为Java对象的完整状态转换图,Session的特定方法触发Java对象由一个状态转换到另一个状态。从图1看出,当Java对象处于临时状态或游离状态,只要不被任何变量引用,就会结束生命周期,它占用的内存就可以被JVM的垃圾回收器回收;当处于持久化状态,由于Session的缓存会引用它,因此它始终处于生命周期中。
临时对象的特征
临时对象具有以下特征:
(1) 不处于Session的缓存中,也可以说,不被任何一个Session实例关联。
(2) 在数据库中没有对应的记录。
在以下情况下,Java对象进入临时状态:
(1) 当通过new语句刚创建了一个Java对象,它处于临时状态,此时不和数据库中的任何记录对应。
(2) Session的delete()方法能使一个持久化对象或游离对象转变为临时对象。对于游离对象,delete()方法从数据库中删除与它对应的记录;对于持久化对象,delete()方法从数据库中删除与它对应的记录,并且把它从Session的缓存中删除。
持久化对象的特征
持久化对象具有以下特征:
(1) 位于一个Session实例的缓存中,也可以说,持久化对象总是被一个Session实例关联。
(2) 持久化对象和数据库中的相关记录对应。
(3) Session在清理缓存时,会根据持久化对象的属性变化,来同步更新数据库。
Session的许多方法都能够触发Java对象进入持久化状态:
(1) Session的save()方法把临时对象转变为持久化对象。
(2) Session的load()或get()方法返回的对象总是处于持久化状态。
(3) Session的find()方法返回的List集合中存放的都是持久化对象。
(4) Session的update()、saveOrUpdate()和lock()方法使游离对象转变为持久化对象。(nate注:根据hibernate reference的说法当试图用update更新一个持久化对象时会抛异常)
(5)当一个持久化对象关联一个临时对象,在允许级联保存的情况下,Session在清理缓存时会把这个临时对象也转变为持久化对象。
游离对象的特征
游离对象具有以下特征:
(1) 不再位于Session的缓存中,也可以说,游离对象不被Session关联。
(2) 游离对象是由持久化对象转变过来的,因此在数据库中可能还存在与它对应的记录(前提条件是没有其他程序删除了这条记录)。
游离对象与临时对象的相同之处在于,两者都不被Session关联,因此Hibernate不会保证它们的属性变化与数据库保持同步。游离对象与临时对象的区别在于:前者是由持久化对象转变过来的,因此可能在数据库中还存在对应的记录,而后者在数据库中没有对应的记录。
Session的以下方法使持久化对象转变为游离对象:
(1) 当调用Session的close()方法时,Session的缓存被清空,缓存中的所有持久化对象都变为游离对象。如果在应用程序中没有引用变量引用这些游离对象,它们就会结束生命周期。
(2)Session的evict()方法能够从缓存中删除一个持久化对象,使它变为游离状态。当Session的缓存中保存了大量的持久化对象,会消耗许多内存空间,为了提高性能,可以考虑调用evict()方法,从缓存中删除一些持久化对象。但是多数情况下不推荐使用evict()方法,而应该通过查询语言,或者显式的导航来控制对象图的深度
java对象的状态由什么表示_持久化层的Java对象可处于哪些状态?这些状态有哪些特征?...相关推荐
- java中的图形界面编辑界面_第58节:Java中的图形界面编程-GUI
欢迎到我的简书查看我的文集 前言: GUI是图形用户界面,在Java中,图形用户界面我们用GUI表示,而GUI的完整英文为: Graphical User Interface(图形用户接口), 所谓图 ...
- java web主流框架整合开发 光盘_开发者突击:Java Web主流框架整合开发(第2版)(附CD光盘1张)...
序言 一.了解软件架构 (一)基本概念 (二)软件架构的历史 (三)软件架构的目标 二.J2EE开发模型分析 (一)一层架构模式 (二)两层架构模式Model 1 (三)三层架构模式Model 2 ( ...
- 如何定义一个类对象并用next()的方法使用_深入理解-可迭代对象、迭代器(20个为什么)...
2019-06-16 深入理解可迭代对象.迭代器 什么是迭代器模式? 当扫描内存中放不下的数据集时,要找到惰性获取数据项的方式,即按需一次获取一个数据项,这就是迭代器模式 迭代器构成? python没 ...
- java主线程和子线程区别_主线程异常– Java
java主线程和子线程区别 Being a Java Programmer, you must have seen exception in thread main sometimes while r ...
- java为属性提供访问器方法_关于继承:Java不继承访问器方法吗?
给定一个扩展了实现接口" DeeDum"的类" Foo"的类" Bar" public interface DeeDum { public ...
- Java API源码在哪里找_详解查看JAVA API及JAVA源码的方法
在java的日常学习中,我们有时候会需要看java的api说明,或者是查看java的源码,使我们更好的了解java,接下来我就来说说如何查看java的api以及java源码 对于java的api,一般 ...
- java画笔能画girl图吗_小巧的国产JAVA特效制作工具?Java Girl
小巧的国产JAVA特效制作工具?Java Girl 作者:未知 文章来源:www.jspcn.net 发布日期:2005年01月19日 在推出gifgirl后不久,任毅的又一免费软件呼吸小秘书之 ...
- java编写桌球游戏素材小球图片_你学不好Java还是有原因的!拿走这套Java系统教程,自学必备...
很多同学都遇到过一种情况:就是无论自己怎么学Java,到头来发现学的都是皮毛,当真正去用python去做一个项目的时候,脑袋里面一片空白.完全不知道从何做起! 那是你没有系统的学过一次Java,现在的 ...
- java题目不会做那么解答_有几道JAVA的题目不会做 哪位高手来解答一下!谢
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 单项选择题. 1. 有关Java语言的说法中,哪种是错误的是( B )? A. java是高级语言 B. ...
最新文章
- oracle10g删除asm组,Oracle 10G RAC 删除已有节点
- 总监调岗至前台,企业被判赔偿26万,法院:“侮辱性调岗”违法
- python【力扣LeetCode算法题库】55-跳跃游戏
- 02.Python基础_标准数据类型_数值型_字符串
- mac升级php后旧版本还在,Mac下更新自带的PHP版本
- Hibernate杂问
- 华为Mate 40系列或推迟到10月底发布:顶配破万无悬念
- theano学习指南5(翻译)- 降噪自动编码器
- Oracle数据库驱动ojdbc6下载
- 服务器安全(防止被攻击)
- 一个聚合搜索网站——老马知搜
- Python鞋码表 以及购鞋尺寸推荐 简单的Python脚本
- 大数据系列之知识点总结和企业级游戏行业架构设计
- 去吗?去啊!喜欢就不要再犹豫
- 内网穿透软件对比——cpolar : 花生壳(中)
- 阶乘、排列、组合 公式计算
- 关于Big-O表示法
- Java基础到Java进阶——Java小白的历练之路------从0到1,开卷!
- 如何为Android Activity设置背景图片?
- 【精选模板】古风汉服影楼摄影PSD源文件,绝美的素材,附带预览图
热门文章
- js判断操作系统与浏览器
- ANT发送邮件需要的3个JAR包
- 同时安装vs2010和VS2012后IEnumerableModelClientValidationRule编译错误
- 4666 Hyperspace stl
- 微软复合文档二进制格式实例分析
- Android9.0 setStereoVolume左右声道流程(二十四)
- Android模拟器图形绘原理(二十二)
- Win10搭建python3环境
- Linux(ARM glibc)使用libhybris调用Android(ARM bionic)
- Android USB audio on Android platform