`

hibernate中java对象的状态

 
阅读更多
  • 临时状态(transient):刚刚用new语句创建,没有被持久化,不处于session中。该对象成为临时对象
  • 持久化状态(persistent):已经被持久化,加入到session的缓存中。该状态的对象为持久化对象。
  • 游离状态(detached):已经被持久化,但不处于session中。该状态的对象为游离对象。

程序代码

生命周期

状态

tx = session.beginTransaction();

Customer c = new Customer(“Tom”,new HashSet);

开始生命周期

临时状态

Session.save(c)

处于生命周期中

转变为持久化状态

Long id=c.getId();

c = null;

Customer c2 = (Customer)session.load(Customer.class,id);

tx.commit();

处于生命周期中

处于持久化状态

session.close();

处于生命周期中

转变为游离态

c2,getName();

处于生命周期中

处于游离态

c2 = null;

结束生命周期

结束生命周期


1、临时对象特征

不处于session中,不被任何session关联。数据库中没有对应的记录。以下情况,对象进入临时状态:

(1).new 语句刚创建了一个对象。

(2).session的delete方法使持久化对象或游离对象转变为临时对象,对于游离对象,该方法从数据库中删除记录,对于持久化对

象,该方法从数据库中删除记录,还要删除缓存中的对象。


2、2、持久化对象特征

(1)、位于一个session缓存中,总是被一个session关联。

(2)、持久化对象和数据库记录相对应。

(3)、以下情况,对象进入持久化:

清理缓存时,会根据对象属性变化,同步更新数据库。

save把临时对象转变为持久化对象。

loadget返回的对象总是持久化状态。

query接口方法返回的list存放的都是持久化对象。

updatesave、saveOrUpdate和LockRequest.lock方法使游离对象转变为持久化对象。

在实际的应用程序中应该避免一个java对象被多个session实例关联,会导致重复执行sql语句,并且极容易出现一些并发问题。

3、游离对象特征

不再位于session的缓存中,游离对象不被session关联。
游离对象由持久化转变过来的,因此在数据库中可能还存在与它对应的记录(前提条件是没有其他程序删除了这条记录)。
当与某持久对象关联的session被关闭后,该持久对象转变为游离对象。当游离对象被重新关联到session上时,并再次转变
成持久对象
在以下情况下,持久化对象转变为游离对象:

(1).sesson.close()方法使缓存被清空,缓存中的所有的对象都变为游离对象。如果没有引用他们的话,他们就会结束生命周期。

(2).sesson.evict(Object args)方法从缓存中删除一个持久化对象,使他变为游离态对象。当缓存中保存了大量的持久化对象时,会消耗许多内存空间,使用该方法删掉一些对象来节省空间


对象的生命周期及转换方法如图所示:


4、Session的增、删、改、查方法:

save(Objectargs):

1.对象加入缓存,成为持久化对象。

2.为持久化对象分配OID

update(Objectargs):

将游离对象转变为持久化对象。不论对象属性是否发生变化,该方法都会执行update操作。如果希望仅当属性变化时才执行update语句的话可进行如下配置:

<class name=“”table=“” select-before-update=“true”>

load和get:

从数据库加载指定的OID持久化对象。如果数据库中不存在该记录时,load方法会抛出异常,而get方法返回null。load是延迟加载,get是立刻加载。

delete(Objectargs)

如果参数是持久化对象,就执行一个delete语句,若为游离对象,先使游离对象被session关联,使他变为持久化对象,然后计划执行一个delete语句。


saveOrUpdate(Objectargs):

该方法同时包含save和update方法,如果参数是临时对象就用save方法,如果是游离对象就用update方法,如果是持久化对象就直接返回。

临时对象判断法:

(1).Java对象的OID为null

(2).Java对象具有version属性并取值为null

(3).在映射文件中为<id>元素设置了unsaved-value属性,并且OID属性取值与属

性匹配。

(4).在映射文件中为<version>元素设置了unsaved-value属性,并且version属性取

值与属性匹配。

(5).自定义了hibernate的Interceptor实现类,并且Interceptor 的isUnsaved方法返回Boolean.true,如果id的类型为long,则默认值为0,此时需要在配置文件中设置idunsaved-value0


分享到:
评论

相关推荐

    精通 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 对象的状态检索

    本人在厦门邦初培训时候 使用的快速入门精简文档 ...对象的临时状态、持久状态和游离状态 用session的update()方法使游离对象转变为持久化对象。 延迟装载 迫切左外链接 HQL检索方式 QBC检索方式 本地SQL检索方式

    Java面试题57.hibernate对象状态及其转换.mp4

    Java面试题57.hibernate对象状态及其转换.mp4

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

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

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

    10.1. Hibernate对象状态(object states) 10.2. 使对象持久化 10.3. 装载对象 10.4. 查询 10.4.1. 执行查询 10.4.2. 过滤集合 10.4.3. 条件查询(Criteria queries) 10.4.4. 使用原生SQL的查询 10.5. 修改...

    对象-关系映射—Hibernate 培训 (中文)

    对象-关系映射—Hibernate 培训 (中文) 目录 一、持久化层-O/R Mapping 二、Hibernate入门 三、Hibernate映射申明(Mapping declaration...四、持久化对象的状态和生命周期 五、Hibernate查询 六、Hibernate最佳实践

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

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

    JDBC与Hibernate区别

    ◆数据状态不同:JDBC操作的数据是“瞬时”的,变量的值无法与数据库中的值保持一致,而Hibernate操作的数据是可持久的,即持久化对象的数据属性的值是可以跟数据库中的值保持一致的。 JDBC与Hibernate读取性能 ...

    57.hibernate对象状态及其转换.avi

    java工程师

    Hibernate中文详细学习文档

    10.1. Hibernate对象状态(object states) 10.2. 使对象持久化 10.3. 装载对象 10.4. 查询 10.4.1. 执行查询 10.4.2. 过滤集合 10.4.3. 条件查询(Criteria queries) 10.4.4. 使用原生SQL的查询 10.5. 修改...

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

    10.1. Hibernate对象状态(object states) 10.2. 使对象持久化 10.3. 装载对象 10.4. 查询 10.4.1. 执行查询 10.4.2. 过滤集合 10.4.3. 条件查询(Criteria queries) 10.4.4. 使用原生SQL的查询 10.5. 修改...

    Hibernate面试题分析_尚硅谷_佟刚

    1. Hibernate 的检索方式有哪些 ? 2. 在 Hibernate 中 Java 对象的状态有哪些 ? 3. Session的清理和清空有什么区别? 4. load()和get()的区别 5. hibernate 优缺点......

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

     6.4.4 级联对象状态   6.5 小结   第7章 高级实体关联映射   7.1 单值的实体关联   7.1.1 共享的主键关联   7.1.2 一对一的外键关联   7.1.3 用联结表映射   7.2 多值的实体关联   7.2.1 一对多...

    hibernate 3中的缓存小结

    当清理缓存时,Hibernate会根据缓存中对象的状态变化来同步更新数据库。 Session为应用程序提供了两个管理缓存的方法: evict(Object obj):从缓存中清除参数指定的持久化对象。 clear():清空缓存中所有持久化对象...

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

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

Global site tag (gtag.js) - Google Analytics