`
kunlong
  • 浏览: 7055 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
最近访客 更多访客>>
社区版块
存档分类
最新评论

在Hibernate应用中Java对象的状态

    博客分类:
  • SSH
阅读更多

应用程序通过new语句创建一个JAVA对象时,JVM会为这个对象分配一块内存空间,只要这个对象被引用,它就一直存在内存中。如果不被引用了,就结束生命周期,会在适当时候被回收。

一、理解Session缓存

Sessionsave()方法持久化一个对象,这个对象将被加入到Session缓存中,以后即使不再引用这个对象,但是只要Session缓存没有被清空,这个对象仍然会处于生命周期中。

 

缓存的作用:

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

2.保证缓存中的对象与数据库中的相关记录保持同步。

3.保证不出现访问对象图的死循环,以及由死循环引起的JVM堆栈溢出异常。清理缓存时,会顺序执行一些SQL语句,具体见书。

 

默认情况,Session会在下面的时间清理缓存:

1.调用commit()方法时

2.调用find()或者iterate()时,如果缓存中持久化对象的属性变化,则要先清理缓存。

3.调用flush()方法时。此方法与commit()不同之处:此方法清理后不会提交事务。

4.例外情况:如果对象用native生成OID,那么当调用save()方法时,会立即执行insert语句。

 

如果需要更改Session清理缓存的时间点,用SessionsetFlushMode()方法,有三种模式:查询  commit  flush

FlushMode.AUTO   清理   清理    清理

FlushMode.COMMIT   不清理   清理   清理

FlushMode.NEVER   不清理  不清理  清理

设置代码为:session. setFlushMode(FlushMode.COMMIT);

 

在下面的情况,需要调用flush()方法:

1.使用触发器

2.混用了Hibernate APIJDBC API

3.JDBC驱动程序不健壮,导致Hibernate在自动清理缓存模式下无法正常工作。

 

二、 Hibernate应用中Java对象的状态

需要被持久化的Java对象,在其生命周期中有三种状态:

1.临时状态:刚用new创建,没被持久化,没在Session缓存中。

2.持久化状态:被持久化,加入到Session缓存中。

3.游离状态:被持久化,没在Session缓存中。

 

(A) 临时对象

特征:不在Session缓存中。在数据库中无相应记录。

如何获得:刚用new创建了一个对象。用Sessiondelete()方法。

 

(B) 持久化对象

特征:在一个Session实例的缓存中。在数据库中有相应记录。Session清理缓存时,会根据持久化对象的属性变化,来同步更新数据库。

如何获得:

Sessionsave()方法。

Sessionload()get()方法。

Sessionfind()方法。

Sessionupdate()saveOrUpdate()lock()方法。

允许级联保存时,如果一个持久化对象关联一个临时对象,Session清理缓存时,会把临时对象转变为持久化对象。

注意:应避免一个Java对象同时被多个Session实例关联。

 

(C) 游离对象

特征:不在Session缓存中。如果没有其他程序删除其对应的纪录,那么数据库中应该有其纪录。

获得:用Sessionclose()方法。用Sessionevict()方法,可以从缓存中删除一个持久化对象。

 

三、Session的保存、更新、删除、查询方法

<1>Sessionsave()方法

完成操作:

1.把要保存的对象加入到缓存中,将其变为持久化对象。

2.选用映射文件指定的标识符生成器为持久化对象分配唯一的OID。(注意,不能修改持久化对象的OID。)

3.执行一个insert语句。(不是立即执行,而是当Session清理缓存时,才会执行。)

注意:不能将持久化对象或游离对象传给save()方法。

<2>Sessionupdate()方法

完成操作:

1.把对象重新加入到Session缓存中,使它变为持久化对象。

2.计划一个update语句,当Session清理缓存时,才会执行。

如果用update关联了一个游离对象,即使这个对象没有被修改,也会生成update语句。要避免这种情况,可以将映射文件中<class>元素的select-before-update=true”(默认false),这样Session清理缓存时,会先执行一个select语句,将原来的数据调出来对比是否一致,只有改变了才会执行update。这一方法会导致多select语句,所以如果数据不会经常变化的话,再这样设置。

注意:不能关联在Session缓存中存在同样OID的游离对象。不能关联在数据库中没有相应记录的游离对象。

<3>SessionsaveOrUpdate()方法

包含save()update()方法的功能。遇到临时对象,就调用save;遇到游离对象,调用update();遇到持久化对象,直接返回。

如何判断是临时or游离对象?

满足下面情况之一,就是临时对象:

1.OID取值为null

2.具有version属性,并取值为null

3.映射文件的<id>元素设置了unsaved-valued属性,且OID取值与其属性值相符。例如,unsaved-valued=0,那么OID0时是临时对象。

4. 映射文件的version元素设置了unsaved-valued属性,且version取值与其属性值相符。

5.自定义了Interceptor实现类,且其isUnsaved()方法返回Boolean.TRUE

<4>Sessionload()get()方法

都根据OID从数据库中加载一个持久化对象。区别:如果不存在于OID对应的纪录,load()抛出异常,get()返回null

<5>Sessiondelete()方法

删除数据库中与Java对象对应的记录。

分享到:
评论

相关推荐

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     8.3 Java对象在Hibernate持久化层的状态  8.3.1 临时对象的特征  8.3.2 持久化对象的特征  8.3.3 被删除对象的特征  8.3.4 游离对象的特征  8.4 Session接口的详细用法  8.4.1 Session的save()和persist()...

    Hibernate持久化对象的生命周期

    Hibernate持久化对象的生命周期 持久化对象的状态: 瞬时对象(Transient Objects)持久化对象(Persist Objects)、离线对象(Detached ...在Hibernate应用中Java对象的状态 Session的保存、更新、删除、查询方法:

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     8.3 Java对象在Hibernate持久化层的状态  8.3.1 临时对象的特征  8.3.2 持久化对象的特征  8.3.3 被删除对象的特征  8.3.4 游离对象的特征  8.4 Session接口的详细用法  8.4.1 Session的save()和persist()...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     8.3 Java对象在Hibernate持久化层的状态  8.3.1 临时对象的特征  8.3.2 持久化对象的特征  8.3.3 被删除对象的特征  8.3.4 游离对象的特征  8.4 Session接口的详细用法  8.4.1 Session的save()和persist()...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

     8.3 Java对象在Hibernate持久化层的状态  8.3.1 临时对象的特征  8.3.2 持久化对象的特征  8.3.3 被删除对象的特征  8.3.4 游离对象的特征  8.4 Session接口的详细用法  8.4.1 Session的save()和persist()...

    精通hibernate:对象持久化技术孙卫琴第二版part2

    本章站在持久化层的角度,Java对象在生命周期中可处于临时状态、持久化状态、删除状态和游离状态。处于持久化状态的Java对象位于一个Session实例的缓存中,Session能根据这个对象的属性变化来同步更新数据库。 8.1 ...

    精通Hibernate:对象持久化技术第二版part3

    本章站在持久化层的角度,Java对象在生命周期中可处于临时状态、持久化状态、删除状态和游离状态。处于持久化状态的Java对象位于一个Session实例的缓存中,Session能根据这个对象的属性变化来同步更新数据库。 8.1 ...

    Hibernate_3.2.0_符合Java习惯的关系数据库持久化

    1.2. 第一部分 - 第一个Hibernate应用程序 1.2.1. 第一个class 1.2.2. 映射文件 1.2.3. Hibernate配置 1.2.4. 用Ant构建 1.2.5. 启动和辅助类 1.2.6. 加载并存储对象 1.3. 第二部分 - 关联映射 1.3.1. ...

    hibernate 3中的缓存小结

    当应用程序调用Session的save()、update()、savaeOrUpdate()、get()或load(),以及调用查询接口的list()、iterate()或filter()方法时,如果在Session缓存中还不存在相应的对象,Hibernate就会把该对象加入到第一级...

    Hibernate实战(第2版 中文高清版)

     10.1.2 Hibernate应用程序中的事务   10.1.3 使用Java Persistence的事务   10.2 控制并发访问   10.2.1 理解数据库级并发   10.2.2 乐观并发控制   10.2.3 获得额外的隔离性保证   10.3 非事务数据...

    hibernate3.2中文文档(chm格式)

    1.2. 第一部分 - 第一个Hibernate应用程序 1.2.1. 第一个class 1.2.2. 映射文件 1.2.3. Hibernate配置 1.2.4. 用Ant构建 1.2.5. 启动和辅助类 1.2.6. 加载并存储对象 1.3. 第二部分 - 关联映射 1.3.1. ...

    Hibernate中文详细学习文档

    1.2. 第一部分 - 第一个Hibernate应用程序 1.2.1. 第一个class 1.2.2. 映射文件 1.2.3. Hibernate配置 1.2.4. 用Ant构建 1.2.5. 启动和辅助类 1.2.6. 加载并存储对象 1.3. 第二部分 - 关联映射 1.3.1. ...

    最全Hibernate 参考文档

    10.1. Hibernate对象状态(object states) 10.2. 使对象持久化 10.3. 装载对象 10.4. 查询 10.4.1. 执行查询 10.4.1.1. 迭代式获取结果(Iterating results) 10.4.1.2. 返回元组(tuples)的查询 10.4.1.3. 标量(Scalar)...

    java源码包---java 源码 大量 实例

    通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,通常应对私钥加密后再保存、如何从...

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

     本书是《轻量级java ee企业应用实战》的姊妹篇,《轻量级java ee企业应用实战》主要介绍以spring+hibernate为基础的java ee应用;本书则主要介绍以ejb 3+jpa为基础的java ee应用。ejb 3、jpa规范都属于sun公司所...

    HibernateAPI中文版.chm

    1.2. 第一部分 - 第一个Hibernate应用程序 1.2.1. 第一个class 1.2.2. 映射文件 1.2.3. Hibernate配置 1.2.4. 用Ant构建 1.2.5. 启动和辅助类 1.2.6. 加载并存储对象 1.3. 第二部分 - 关联映射 1.3.1. ...

    JAVA上百实例源码以及开源项目

    通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,通常应对私钥加密后再保存、如何从...

    java源码包2

    通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,通常应对私钥加密后再保存、如何从...

    JAVA上百实例源码以及开源项目源代码

    通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,通常应对私钥加密后再保存、如何从...

Global site tag (gtag.js) - Google Analytics