`

在Hibernate应用中Java对象的状态

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

一、理解Session缓存

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



缓存的作用:

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

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

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



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

1.调用commit()方法时

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

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

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



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

FlushMode.AUTO   清理   清理    清理

FlushMode.COMMIT   不清理   清理   清理

FlushMode.NEVER   不清理  不清理  清理

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



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

1.使用触发器

2.混用了Hibernate API和JDBC API

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



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

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

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

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

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



(A) 临时对象

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

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



(B) 持久化对象

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

如何获得:

用Session的save()方法。

用Session的load()或get()方法。

用Session的find()方法。

用Session的update()、saveOrUpdate()、lock()方法。

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

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



(C) 游离对象

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

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



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

<1>Session的save()方法

完成操作:

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

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

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

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

<2>Session的update()方法

完成操作:

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

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

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

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

<3>Session的saveOrUpdate()方法

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

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

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

1.OID取值为null

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

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

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

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

<4>Session的load()、get()方法

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

<5>Session的delete()方法

删除数据库中与Java对象对应的记录。
分享到:
评论

相关推荐

    精通Hibernate:Java对象持久化详解.zip

    在Java开发中,持久化是将应用程序中的对象状态保存到持久存储介质(如数据库)的过程。Hibernate通过提供一种对象-关系映射机制,使得Java对象可以直接与数据库表进行交互,而无需编写大量的SQL语句。这种映射机制...

    精通 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:Java对象持久化技术详解

    在Java应用开发中,对象持久化是一个关键环节,它涉及将程序中的对象状态存储到持久化介质(如关系型数据库)中,并在需要时恢复这些状态。Hibernate作为ORM(对象关系映射)框架,通过提供一种面向对象的方式来处理...

    HIBERNATE - 符合Java习惯的关系数据库持久化

    2. **对象状态**:Hibernate管理的对象具有三种状态:瞬时态(Transient)、持久态(Persistent)和脱管态(Detached),它们的状态转换由Hibernate的Session负责。 3. **JMX集成**:允许通过JMX(Java Management ...

    精通Hibernate:Java持久化对象技术详解[第二版]

    1. **Hibernate概述**:介绍Hibernate的基本概念、发展历程及其在Java应用中的重要地位,阐述其设计理念和主要功能。 2. **环境配置**:讲解如何配置Hibernate所需的环境,包括JDK、数据库、IDE等,以及编写基本的...

    Java 精通Hibernate对象持久化技术权威指南

    总的来说,这本书和配套文档为Java开发者提供了全面的Hibernate学习资源,无论你是初学者还是有经验的开发者,都能从中受益匪浅,提升你在J2EE开发中的对象持久化能力。通过深入理解和实践,你可以更加自如地应对...

    Hibernate 操纵持久化对象

    在Java开发中,Hibernate是一个强大的对象关系映射(ORM)框架,它简化了数据库与Java对象之间的交互。本篇将详细讲解如何使用Hibernate来操纵持久化对象,这对于深入理解Hibernate的核心概念至关重要。 **一、...

    Hibernate对象状态以及各种保存方法的区别

    Hibernate 是一个流行的 Java 开发框架,用于简化数据库...理解 Hibernate 对象状态及其转换对于有效管理和优化数据库操作至关重要。正确使用这些状态和保存方法能够避免数据冗余和丢失,提高应用的性能和数据一致性。

    Hibernate中对象的三种状态

    它们没有持久化标识(ID),在Hibernate的眼里,这些对象就像普通的Java对象,如果程序结束或者对象引用丢失,这些对象就会被垃圾回收器清除,数据不会保存到数据库中。在Hibernate中,通过`new`关键字创建的对象...

    (高清版)精通 Hibernate_Java 对象持久化技术详解(第2版).pdf

    - **概念**:对象持久化是指将程序中的对象状态保存到外部存储介质的过程,以便在系统重启后仍然可以恢复这些对象的状态。 - **实现方式**:在Java中,常见的对象持久化方式包括使用Java序列化机制、XML文件、数据库...

    Hibernate操作持久化对象

    Hibernate是一个基于JDBC的ORM框架,它通过XML或注解定义对象-关系映射,将Java对象转换为数据库记录,反之亦然。它封装了JDBC,提供了更高级别的API,使得数据库操作更加简单和高效。Hibernate支持多种数据库,包括...

    精通Hibernate:java对象持久化技术

    【精通Hibernate:Java对象持久化技术】主要涵盖了Java应用程序的分层体系结构、软件模型以及对象持久化的概念,特别是如何使用Hibernate这一ORM框架进行持久化操作。以下是详细的知识点解析: 1. **应用程序分层...

    Hibernate持久化对象的生命周期

    Hibernate的核心概念之一就是持久化对象的生命周期,这涉及到对象在数据库中的状态及其与Session的关系。 首先,我们来看一下Hibernate中持久化对象的三种基本状态: 1. **瞬时对象(Transient Objects)**: - ...

    java Hibernate 中文API文档

    1. **对象关系映射(ORM)**:Hibernate通过ORM机制,将Java对象转换为数据库中的记录,反之亦然。这样,程序员可以使用面向对象的方式处理数据库操作,降低了数据库操作的复杂性。 2. **Session接口**:Hibernate...

    Hibernate对象持久化状态

    在 Hibernate 框架中,Java 对象的状态管理和 Session 缓存是核心概念,它们直接影响着数据的持久化过程和数据库...同时,根据具体应用需求,选择合适的缓存清理策略和对象状态转换时机,以达到最佳的数据库操作效果。

    Hibernate的Java控制台程序Demo

    **Hibernate的Java控制台程序Demo**是用于演示如何在Java应用程序中使用Hibernate框架进行对象关系映射(ORM)操作的实例。在这个项目中,我们将会深入理解Hibernate的核心概念,包括配置、实体类、持久化、会话管理...

    hibernate应用开发完全手册(源码)

    1. **对象关系映射(ORM)**:Hibernate的核心在于ORM,它通过XML配置或注解方式定义对象与数据库表的映射关系,使得Java对象可以直接在数据库中持久化。 2. **Session接口**:Hibernate中的Session是数据库会话的...

    hibernate对象三状态及OneToOne&OneToMany&ManyToMany

    在Java世界中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它简化了数据库操作,使得开发者可以使用面向对象的方式来处理数据。本篇将详细阐述Hibernate中的对象三状态、一对一(OneToOne)、一对多...

Global site tag (gtag.js) - Google Analytics