Java对象在Hibernate持久化层的状态
2016-06-25 13:19
267 查看
原文地址 CoderGO : http://leekai.me/?p=219
临时状态(transient):刚用new语句创建,还没有被持久化,尚未处于Session的缓存中。处于临时状态的Java对象被称为临时对象。
持久化状态(persistent):已经被持久化,并加入到Session的缓存中。处于持久化状态的Java对象被称为持久化对象。
删除状态(removed):不再处于Session的缓存中,并且Session已经计划将其从数据库中删除。处于删除状态的Java对象被称为删除对象。
游离状态(detached):已经被持久化,但不再处于Session的缓存中。处于游离状态的Java对象称为游离对象。
![](http://leekai.me/wp-content/uploads/2016/06/hibernate_java_state.png)
使用代理主键的情况下,OID通常为null。
不处于Session的缓存中,即和任意一个Session实例关联。
数据库中没有对应的记录
以下情况,Java对象进入临时状态:
使用new语句创建一个Java对象。
在Hibenrate配置文件中,hibernate.user_identifier_rollback属性为true情况下,Session的delete()可以使得一个持久化对象或者游离对象转变为临时对象。
OID不为null。
位于Session缓存中,即持久化对象总是被Session实例关联。
持久化对象在数据库中有相应的记录所对应。
Session清理缓存时,会根据持久化对象的属性变化,同步更新数据库。
Session的save()将临时对象转变为持久化对象。
Session的load()或get()方法返回的对象是持久化对象。
Query.list()返回的对象是持久化对象。
Session的update(), saveOrUpdate()和lock()方法使得游离对象转变为持久化对象。
持久化对象关联一个临时对象时,允许级联保存情况下,Session在清理缓存时会把此临时状态转变为持久化对象。
OID不为null。
从一个Session实例的缓存中删除。
被删除对象和数据库中的相关记录对应。
Session计划将其从数据库中删除。
Session在清理缓存时,会执行SQL的delete语句,删除相应记录。
一般情况,应用程序不应再使用被删除对象。
在以下情况下,Java对象进入删除状态:
在Hibernate配置文件中hibernate.use_identifier_rollback属性取默认值false时,Session.delete()将持久化对象和游离对象转变为被删除对象。
当持久化对象A关联一个持久化对象B,允许级联删除时,Session删除持久化对象A时,会级联删除持久化对象B,A和B均进入删除状态。
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()会清理缓存中的所有持久化对象,使其变为游离对象。
理清楚Session中Java对象的状态和状态转换至关重要,在应用程序中应明确知道每个Java对象再Hibernate中所处于的状态,以避免/排除某些错误。
引言
对于JVM来说,Java对象状态很简单,一个是new创建的新对象,一个是没有任何对象引用它时的垃圾对象,对于垃圾对象,JVM会在合适时间对其进行回收。对与Hibernate来说,一个Java对象会有四种状态:临时状态(transient):刚用new语句创建,还没有被持久化,尚未处于Session的缓存中。处于临时状态的Java对象被称为临时对象。
持久化状态(persistent):已经被持久化,并加入到Session的缓存中。处于持久化状态的Java对象被称为持久化对象。
删除状态(removed):不再处于Session的缓存中,并且Session已经计划将其从数据库中删除。处于删除状态的Java对象被称为删除对象。
游离状态(detached):已经被持久化,但不再处于Session的缓存中。处于游离状态的Java对象称为游离对象。
一、Java对象状态转换
图 1 Java对象在Hibernate中的状态转换图![](http://leekai.me/wp-content/uploads/2016/06/hibernate_java_state.png)
二、对象状态详解
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对象持久化技术详解。相关文章推荐
- springmvc第一篇
- Java程序初始化顺序
- eclipse安装genymobile方法
- Struts学习体验【坚持更新】
- java8快速入门
- java c3p0连接池 不用spring单独使用c3p0
- 54. spring boot日志升级篇—logback【从零开始学Spring Boot】
- csdn博客刷点击率(java代码)
- 工程目录 Java/Web/Maven
- Java中的泛型
- 学习笔记:第12章 Java语言程序设计
- 解决Hibernate中自动生成的findByProperty函数无法工作的问题-java SSH整合系列
- 《编程导论(Java)·9.3.1回调·2》什么是好莱坞法则
- Java学习日记 求最值 排序 选择 冒泡 交换
- Java学习日记 查表法十进制转十六进制
- springboot-基础入门
- <JAVA学习笔记6>——程序死锁、中断
- Java堆和栈的区别
- 美就是Java.不会有学MFC的痛苦
- 搭起Java开发环境