单篇 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对象处在生命周期下
对象的状态转换图
如有好的建议,可留言或发至笔者邮箱:fzb_xxzy@163.com
前言: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
相关文章推荐
- Hibernate应用中Java对象的状态
- Hibernate应用中Java对象的状态
- 在Hibernate 应用中的Java对象的状态
- 在Hibernate应用中Java对象的状态
- 在Hibernate应用中Java对象的状态
- Hibernate的JAVA对象的3种状态
- 精通Hibernate——Hibernate中Java对象的状态详解
- hibernate 中java对象的三种状态
- Hibernate中Java对象的三种状态以及之间的转换 ----Hibernate_4
- hibernate中的java对象状态
- Hibernate框架基础——在Hibernate中java对象的状态
- Hibernate中Java对象的三种状态
- Hibernate基础---映射文件、配置文件、Java对象的三种状态
- hibernate中的java对象有几种状态,其相互关系如何(区别和相互转换)
- Hibernate中java对象的状态
- hibernate中java对象的状态
- hibernate系列二:hibernate中java对象的三种状态及数据更新的4种方式
- Hibernate之hibernate中java对象的状态
- Hibernate的JAVA对象的3种状态
- Java程序员从笨鸟到菜鸟之(六十二)细谈Hibernate(十三)session缓存机制和三种对象状态