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

单篇 Hibernate应用中Java对象的状态

2014-01-01 21:06 225 查看
单篇 Hibernate应用中Java对象的状态

前言:Session具有一个缓存,位于缓存中的对象处于持久化状态(解释为什么是3态,而不是4态),它和数据库中的相关记录对应,Session能够在某些时间点,按照缓存中持久化的属性来同步更新数据库,这一过程被称为清理缓存。

1、 Java对象在JVM中的生命周期

当应用程序通过new语句创建一个Java对象时,JVM会为这个对象分配一块内存空间,只要这个对象被引用,它就一直存在与内存中。如果这个对象不被任何引用变量引用,它就结束生命周期,此时JVM的垃圾回收器会再适当时候回收它占用的内存。

注明:Java集合(如set、list和map)的一个重要特性是:集合中存放的是Java对象的引用。当向集合中添加一个对象时,其实是把这个对象的引用添加到集合中。

2、 理解Session的缓存

(1)如果希望一个Java对象一直处于生命周期中,就必须保证至少一个变量引用他,或者在一个Java集合中存放这个对象的引用。

(2)在Session接口的实现类SessionImpl中定义了一系列的Java集合,这些Java集合构成了Session的缓存。

(3)当Session的save()方法持久化一个Customer对象时,Custmer对象被加入Session的缓存中,以后即使程序中的引用变量中不再引用Customer对象,只要Session的缓存还没有被清空,Customer对象仍然处于生命周期中。当Session的load()方法视图从数据库中加载一个Customer对象时,Session先判断缓存中是否已经存在这个Customer对象,就不需要再到数据库中检索。

注明:Session的缓存理解为装Java对象的变量的集合。

3、 Session的缓存有两大作用

(1)减少访问数据库的频率。

(2)保证缓存中的对象鱼数据库中的相关记录保持同步。位于缓存中的对象被称为持久化对象。当缓存中持久化对象的状态发生了变换,Session并不会立即执行相关的SQL语句,这使得Session能够把几条相关的SQL语句合并为一条SQL语句,以便减少访问数据库的次数,从而提高应用程序的性能。

提示:当Session加载了Customer对象后,会为Customer对象的值类型的属性复制一份快照。当Session清理缓存时,通过比较Customer对象的当前属性与它的快照,Session能够判断Customer对象的哪些属性发生了变化。

4、 Session清理缓存

(1)Session进行清理缓存的例外情况是,如果对象使用native生成器来生成OID,那么当调用Session的save()保存改对象时,会立即执行向数据库插入该实体的insert语句。

(2)注意Session的commit()和flush()方法的区别。flush()方法进行清理缓存的操作,执行一系列的SQL语句,但不会提交事务。commit()方法会先调用flush()方法,然后提交事务。提交事务以为着对数据库所做的更新被永久保存下来。

(3)Session的setFlushMode()方法用于设定清理缓存的时间点。FlushMode类定义了三种不同的清理模式:FlushMode.AUTO、FlushMode.COMMIT和FlushMode.NEVER。

例如

Session.setFlushMode(FlushMode.COMMIT);

下面列出清理模式执行清理缓存操作的时间点:

注意:FlushMode.AUTO是默认值,这也是优先考虑的清理模式,它会保证整个事务中,数据保持一致。

注意:在多数情况下,应用程序不需要显示调用Session的flush()方法,flush()方法适用于某些特定场合。

5、 在Hibernate应用中Java对象的状态

对于需要被持久化的Java对象,在它的生命周期中,可处于以下三个状态之一。

<>临时状态(transient):刚刚用new语句创建,还没有被持久化,不处于Session的缓存中。处于临时状态的Java对象被称为临时对象。

<>持久化状态(persistent):已经被持久化,加入到Session的缓存中。处于持久化状态的Java对象被称为持久化对象。

<>游离状态(detached):已经被持久化,但不在处于Session的缓存中。处于游离状态的Java对象被称为游离对象。

(1)注意持久化类与持久化对象是不同的概念。持久化类的实例可以处于临时状态、持久化状态和游离状态。其中对于持久化状态的实例被称为持久化对象。

(2)常见,对象的状态有两种定义,一种含义是指由对象的属性表示的数据,一种含义是指以上的临时状态、持久化状态或游离状态之一。

Java对象处在生命周期下

状态
持久化
Session的缓存
临时状态
×
×
游离状态

×
(不存在)
×

持久化状态


对象的状态转换图





如有好的建议,可留言或发至笔者邮箱:fzb_xxzy@163.com
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: