Java对象在Hibernate持久化层的状态
来源:互联网 发布:梳理机隔局数据 编辑:程序博客网 时间:2024/05/21 09:41
原文地址 CoderGO : http://leekai.me/?p=219
引言
对于JVM来说,Java对象状态很简单,一个是new创建的新对象,一个是没有任何对象引用它时的垃圾对象,对于垃圾对象,JVM会在合适时间对其进行回收。对与Hibernate来说,一个Java对象会有四种状态:
- 临时状态(transient):刚用new语句创建,还没有被持久化,尚未处于Session的缓存中。处于临时状态的Java对象被称为临时对象。
- 持久化状态(persistent):已经被持久化,并加入到Session的缓存中。处于持久化状态的Java对象被称为持久化对象。
- 删除状态(removed):不再处于Session的缓存中,并且Session已经计划将其从数据库中删除。处于删除状态的Java对象被称为删除对象。
- 游离状态(detached):已经被持久化,但不再处于Session的缓存中。处于游离状态的Java对象称为游离对象。
一、Java对象状态转换
图 1 Java对象在Hibernate中的状态转换图
二、对象状态详解
1.临时状态详解
临时状态有一下特征:
- 使用代理主键的情况下,OID通常为null。
- 不处于Session的缓存中,即和任意一个Session实例关联。
- 数据库中没有对应的记录
以下情况,Java对象进入临时状态:
- 使用new语句创建一个Java对象。
- 在Hibenrate配置文件中,hibernate.user_identifier_rollback属性为true情况下,Session的delete()可以使得一个持久化对象或者游离对象转变为临时对象。
2.持久化对象的特征
持久化对象有以下特征:
- OID不为null。
- 位于Session缓存中,即持久化对象总是被Session实例关联。
- 持久化对象在数据库中有相应的记录所对应。
- Session清理缓存时,会根据持久化对象的属性变化,同步更新数据库。
- Session的save()将临时对象转变为持久化对象。
- Session的load()或get()方法返回的对象是持久化对象。
- Query.list()返回的对象是持久化对象。
- Session的update(), saveOrUpdate()和lock()方法使得游离对象转变为持久化对象。
- 持久化对象关联一个临时对象时,允许级联保存情况下,Session在清理缓存时会把此临时状态转变为持久化对象。
3.被删除对象特征
被删除对象有以下特征:
- OID不为null。
- 从一个Session实例的缓存中删除。
- 被删除对象和数据库中的相关记录对应。
- Session计划将其从数据库中删除。
- Session在清理缓存时,会执行SQL的delete语句,删除相应记录。
- 一般情况,应用程序不应再使用被删除对象。
在以下情况下,Java对象进入删除状态:
- 在Hibernate配置文件中hibernate.use_identifier_rollback属性取默认值false时,Session.delete()将持久化对象和游离对象转变为被删除对象。
- 当持久化对象A关联一个持久化对象B,允许级联删除时,Session删除持久化对象A时,会级联删除持久化对象B,A和B均进入删除状态。
4.游离对象的特征
游离对象具有以下特征:
- OID不为null
- 不再位于Session缓存中,不被Session关联。
- 游离对象是由持久化对象转变而来,因此数据库中可能还存在相应记录。
游离对象和临时状态相同点与区别:
相同: 均没有被Session关联,hibernate不会保证对象与数据库记录同步。
区别: 游离对象由持久化对象转变而来,数据库中可能还有相应记录,OID不为null,而临时对象则没有,OID为null。
游离对象和被删除对象相同与区别:
相同: 均不位于Session的缓存中,并且数据库中都可能有相应记录。
不同: 游离对象完全脱离于Session,被删除对象被Session计划从数据库中删除,等到Session清理缓存时,会执行SQL delete语句,从数据库中删除记录。
Session的以下方法会使得持久化对象转变为游离对象:
- 当调用Session的close()方法时,Session的缓存会被清空,缓存中所有持久化对象都变为游离对象。如果Java应用程序没有引用它们,则会随后被垃圾回收器再某时回收。
- Sesision.evict()方法可以从缓存中清理一个持久化对象,将其变为游离对象。Session缓存中保存过多的持久化对象会消耗内存。
- Session.clear()会清理缓存中的所有持久化对象,使其变为游离对象。
总结
——本文为《精通Hibernate》1读书笔记
理清楚Session中Java对象的状态和状态转换至关重要,在应用程序中应明确知道每个Java对象再Hibernate中所处于的状态,以避免/排除某些错误。
附:
1.精通Hibernate:java对象持久化技术详解。
0 0
- Java对象在Hibernate持久化层的状态
- java对象在hibernate持久层的状态
- 域对象在持久化层的三种状态
- 持久化层的Java对象可处于哪些状态?
- 【java】——Hibernate持久化对象的三个状态
- hibernate的持久化对象的状态
- Hibernate持久化对象的状态
- hibernate 持久化对象的状态
- Hibernate 持久化对象的状态
- Hibernate持久化对象的状态
- Hibernate对象的持久化状态
- Hibernate持久化对象的三个状态
- hibernate持久化对象的三个状态
- Hibernate持久化对象的状态
- Hibernate中持久化对象的状态
- Hibernate 持久化对象的状态
- Hibernate持久化对象的状态
- Hibernate持久化对象的状态
- C语言基础 定义并初始化一个二维的字符型数组
- hdu 1224 Free DIY Tour【SPFA最长路+输出路径】
- iOS:KVO的概述与使用
- linux下tomcat运行war包常用命令
- IllegalArgumentException: Multiple entries with same key: 24.0.0 rc4=24.0.0 rc4 and 24.0.0 rc4=24.0.
- Java对象在Hibernate持久化层的状态
- PowerPoint常见问题及对策之如何对齐多个对象
- C语言基础 整行输入输出二维字符型数组
- 折半查找,要求必须是升序数组
- 什么是异常?
- LINUX学习_1
- 项目实践:电话薄程序
- 10个给力的在线Web设计开发工具介绍
- 推荐十四款常见的Web前端开发框架