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

来源:互联网 发布:梳理机隔局数据 编辑:程序博客网 时间:2024/05/21 09:41

原文地址 CoderGO : http://leekai.me/?p=219

引言

对于JVM来说,Java对象状态很简单,一个是new创建的新对象,一个是没有任何对象引用它时的垃圾对象,对于垃圾对象,JVM会在合适时间对其进行回收。对与Hibernate来说,一个Java对象会有四种状态:

  1. 临时状态(transient):刚用new语句创建,还没有被持久化,尚未处于Session的缓存中。处于临时状态的Java对象被称为临时对象。
  2. 持久化状态(persistent):已经被持久化,并加入到Session的缓存中。处于持久化状态的Java对象被称为持久化对象。
  3. 删除状态(removed):不再处于Session的缓存中,并且Session已经计划将其从数据库中删除。处于删除状态的Java对象被称为删除对象。
  4. 游离状态(detached):已经被持久化,但不再处于Session的缓存中。处于游离状态的Java对象称为游离对象。

一、Java对象状态转换

图 1 Java对象在Hibernate中的状态转换图
Java对象状态转换

二、对象状态详解

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
原创粉丝点击