您的位置:首页 > 编程语言 > Java开发

Java对象在Hibernate持久化层的状态

2016-06-25 13:19 267 查看
原文地址 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对象持久化技术详解。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: