当应用程序通过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对象可处于哪些状态?这些状态有哪些特征?...相关推荐

  1. java中的图形界面编辑界面_第58节:Java中的图形界面编程-GUI

    欢迎到我的简书查看我的文集 前言: GUI是图形用户界面,在Java中,图形用户界面我们用GUI表示,而GUI的完整英文为: Graphical User Interface(图形用户接口), 所谓图 ...

  2. java web主流框架整合开发 光盘_开发者突击:Java Web主流框架整合开发(第2版)(附CD光盘1张)...

    序言 一.了解软件架构 (一)基本概念 (二)软件架构的历史 (三)软件架构的目标 二.J2EE开发模型分析 (一)一层架构模式 (二)两层架构模式Model 1 (三)三层架构模式Model 2 ( ...

  3. 如何定义一个类对象并用next()的方法使用_深入理解-可迭代对象、迭代器(20个为什么)...

    2019-06-16 深入理解可迭代对象.迭代器 什么是迭代器模式? 当扫描内存中放不下的数据集时,要找到惰性获取数据项的方式,即按需一次获取一个数据项,这就是迭代器模式 迭代器构成? python没 ...

  4. java主线程和子线程区别_主线程异常– Java

    java主线程和子线程区别 Being a Java Programmer, you must have seen exception in thread main sometimes while r ...

  5. java为属性提供访问器方法_关于继承:Java不继承访问器方法吗?

    给定一个扩展了实现接口" DeeDum"的类" Foo"的类" Bar" public interface DeeDum { public ...

  6. Java API源码在哪里找_详解查看JAVA API及JAVA源码的方法

    在java的日常学习中,我们有时候会需要看java的api说明,或者是查看java的源码,使我们更好的了解java,接下来我就来说说如何查看java的api以及java源码 对于java的api,一般 ...

  7. java画笔能画girl图吗_小巧的国产JAVA特效制作工具?Java Girl

    小巧的国产JAVA特效制作工具?Java Girl 作者:未知    文章来源:www.jspcn.net 发布日期:2005年01月19日 在推出gifgirl后不久,任毅的又一免费软件呼吸小秘书之 ...

  8. java编写桌球游戏素材小球图片_你学不好Java还是有原因的!拿走这套Java系统教程,自学必备...

    很多同学都遇到过一种情况:就是无论自己怎么学Java,到头来发现学的都是皮毛,当真正去用python去做一个项目的时候,脑袋里面一片空白.完全不知道从何做起! 那是你没有系统的学过一次Java,现在的 ...

  9. java题目不会做那么解答_有几道JAVA的题目不会做 哪位高手来解答一下!谢

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 单项选择题. 1.      有关Java语言的说法中,哪种是错误的是(   B   )? A. java是高级语言                B. ...

最新文章

  1. oracle10g删除asm组,Oracle 10G RAC 删除已有节点
  2. 总监调岗至前台,企业被判赔偿26万,法院:“侮辱性调岗”违法
  3. python【力扣LeetCode算法题库】55-跳跃游戏
  4. 02.Python基础_标准数据类型_数值型_字符串
  5. mac升级php后旧版本还在,Mac下更新自带的PHP版本
  6. Hibernate杂问
  7. 华为Mate 40系列或推迟到10月底发布:顶配破万无悬念
  8. theano学习指南5(翻译)- 降噪自动编码器
  9. Oracle数据库驱动ojdbc6下载
  10. 服务器安全(防止被攻击)
  11. 一个聚合搜索网站——老马知搜
  12. Python鞋码表 以及购鞋尺寸推荐 简单的Python脚本
  13. 大数据系列之知识点总结和企业级游戏行业架构设计
  14. 去吗?去啊!喜欢就不要再犹豫
  15. 内网穿透软件对比——cpolar : 花生壳(中)
  16. 阶乘、排列、组合 公式计算
  17. 关于Big-O表示法
  18. Java基础到Java进阶——Java小白的历练之路------从0到1,开卷!
  19. 如何为Android Activity设置背景图片?
  20. 【精选模板】古风汉服影楼摄影PSD源文件,绝美的素材,附带预览图

热门文章

  1. js判断操作系统与浏览器
  2. ANT发送邮件需要的3个JAR包
  3. 同时安装vs2010和VS2012后IEnumerableModelClientValidationRule编译错误
  4. 4666 Hyperspace stl
  5. 微软复合文档二进制格式实例分析
  6. Android9.0 setStereoVolume左右声道流程(二十四)
  7. Android模拟器图形绘原理(二十二)
  8. Win10搭建python3环境
  9. Linux(ARM glibc)使用libhybris调用Android(ARM bionic)
  10. Android USB audio on Android platform