`

浅谈对象在Hibernate中的状态

阅读更多
浅谈对象在Hibernate中的状态
===========================================================
作者: wqbi(http://wqbi.itpub.net)
发表于: 2006.05.31 00:07
分类: hiberante之旅
出处: http://wqbi.itpub.net/post/2966/106400
---------------------------------------------------------------

Hibernate中的对象有三种状态: 瞬时状态(Transient),持久状态(Persistent),
1. 脱管状态(Detached)



1. 1.瞬时状态(Transient)

由new命令开辟内存空间的Java对象,也就是平时所熟悉的普通Java对象。

如:Student stu = new Student();


瞬时对象特点:

(1)不和Session实例关联

(2)在数据库中没有和瞬时对象关联的记录


2. 2.持久状态(Persistent)

持久的实例在数据库中有对应的记录,并拥有一个持久化标识(identifier).

持久对象总是与Session和Transaction相关联,在一个Session中,对持久对象的改变不会马上对数据库进行变更,而必须在Transaction终止,也就是执行commit()之后,才在数据库中真正运行SQL进行变更,持久对象的状态才会与数据库进行同步。在同步之前的持久对象称为脏(dirty)对象。


瞬时对象转为持久对象:

(1) 通过Session的save()和saveOrUpdate()方法把一个瞬时对象与数据库相关联,这个瞬时对象就成为持久化对象。

(2) 使用fine(),get(),load()和iterater()待方法查询到的数据对象,将成为持久化对象。


持久化对象的特点:

(1) 和Session实例关联

(2) 在数据库中有和持久对象关联的记录


3. 3.脱管状态(Detached)

与持久对象关联的Session被关闭后,对象就变为脱管对象。对脱管对象的引用依然有效,对象可继续被修改。


脱管对象特点:

(1) 本质上和瞬时对象相同

(2) 只是比爱瞬时对象多了一个数据库记录标识值id.


持久对象转为脱管对象:

当执行close()或clear(),evict()之后,持久对象会变为脱管对象。


瞬时对象转为持久对象:

通过Session的update(),saveOrUpdate()和lock()等方法,把脱管对象变为持久对象。


三种状态相互转化的状态图如下:








4.结合save(),update(),saveOrUpdate()方法说明对象的状态

(1)Save()方法将瞬时对象保存到数据库,对象的临时状态将变为持久化状态。当对象在持久化状态时,它一直位于Session的缓存中,对它的任何操作在事务提交时都将同步到数据库,因此,对一个已经持久的对象调用save()或update()方法是没有意义的。如:

Student stu = new Strudnet();

stu.setCarId(“200234567”);

stu.setId(“100”);

//打开Session,开启事务

session.save(stu);

stu.setCardId(“20076548”);

session.save(stu); //无效

session.update(stu); //无效

//提交事务,关闭Session


(2)update()方法两种用途重新关联脱管对象为持久化状态对象,显示调用update()以更新对象。调用update()只为了关联一个脱管对象到持久状态,当对象已经是持久状态时,调用update()就没有多大意义了。如:

//打开session,开启事务

stu = (Student)session.get(Student.class,”123456”);

stu.setName(“Body”);

session.update(stu); //由于stu是持久对象,必然位于Session缓冲中,对stu所做的变更将

//被同步到数据库中。所以update()是没有意义的,可以不要这句效果一样的。

//提交事务,关闭Session


Hibernate总是执行update语句,不管这个脱管对象在离开Session之后有没有更改过,在清理缓存时Hibernate总是发送一条update语句,以确保脱管对象和数据库记录的数据一致,如:

Student stu = new Strudnet();

stu.setCarId(“1234”);

//打开Session1,开启事务

session1.save(stu);

//提交事务,关闭Session1

stu.set(“4567”); //对脱管对象进行更改

//打开Session2,开启事务

session2.update(stu);

//提交事务,关闭Session2


注:即使把session2.update(stu);这句去掉,提交事务时仍然会执行一条update()语句。


如果希望只有脱管对象改变了,Hibernate才生成update语句,可以把映射文件中<class>标签的select-before-update设为true,这种会先发送一条select语句取得数据库中的值,判断值是否相同,如果相同就不执行update语句。不过这种做法有一定的缺点,每次update语句之前总是要发送一条多余的select语句,影响性能。对于偶尔更改的类,设置才是有效的,对于经常要更改的类这样做是影响效率的。


(3)saveOrUpdate()方法兼具save()和update()方法的功能,对于传入的对象,saveOrUpdate()首先判断其是脱管对象还是临时对象,然后调用合适的方法。


分享到:
评论

相关推荐

    Hibernate 对象的三种状态和特点

    在Java的持久化框架Hibernate中,对象的状态是理解其工作原理的关键部分。这些状态决定了对象与数据库之间的关联程度,以及Hibernate如何处理对象的生命周期。以下是Hibernate对象的三种主要状态及其特点: 1) 临时...

    hibernate中session对象的状态详解

    hibernate中session对象的状态详解

    Hibernate中对象的三种状态

    在Java的持久化框架Hibernate中,对象的状态管理是其核心特性之一。理解并掌握对象的三种状态对于开发高效、稳定的数据库应用至关重要。本篇将详细阐述Hibernate中的瞬时态、持久态和脱管态,以及它们之间的转换。 ...

    hibernate对象三种状态

    在Java的持久化框架Hibernate中,对象存在三种不同的状态,分别是持久态(Persistent)、自由态(Transient)和游离态(Detached)。这三种状态分别对应了对象与数据库的关联程度,理解它们对于高效地使用Hibernate...

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

    在 Hibernate 中,对象的状态管理是至关重要的,因为它直接影响到对象如何与数据库交互。以下是 Hibernate 中对象的三种状态以及相关的保存方法: 1. **瞬时对象(Transient Objects)** - 当使用 `new` 关键字...

    Hibernate中的实体状态及转换

    在Java的ORM框架Hibernate中,实体管理是其核心功能之一,而实体的状态管理则是理解Hibernate工作原理的关键。本文将深入探讨Hibernate中的实体状态及其转换,帮助开发者更好地掌握如何有效地使用Hibernate进行数据...

    深入浅出 Hibernate.pdf

    1. **Session**: Session是Hibernate中最常用的一个接口,它代表了一个与数据库之间的会话。所有的持久化操作都应该在Session的上下文中进行。 2. **SessionFactory**: SessionFactory是线程安全的,它是创建Session...

    Hibernate持久化对象的生命周期

    首先,我们来看一下Hibernate中持久化对象的三种基本状态: 1. **瞬时对象(Transient Objects)**: - 当使用`new`关键字创建一个新的Java对象时,该对象是瞬时的。这意味着它们与数据库没有任何关联。如果对象...

    浅谈Spring+Hibernate整合(共16页).doc

    Spring 和 Hibernate 是两个在 Java 开发中广泛应用的框架,它们分别负责不同的职责。Spring 是一个轻量级的容器,提供依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP)等...

    Hibernate对象持久化状态

    在 Hibernate 框架中,Java 对象的状态管理和 Session 缓存是核心概念,它们直接影响着数据的持久化过程和数据库交互效率。本篇文章将详细阐述 Hibernate 中对象的三种状态——临时状态、持久化状态和游离状态,以及...

    《深入浅出Hibernate》读书笔记

    其次,实体对象的识别在Hibernate中基于主键值。默认情况下,对象的比较是通过主键值进行的,若需要自定义比较逻辑,需要重写equals()和hashCode()方法。Hibernate通过内部的"EntityEntry"数据结构跟踪实体对象的...

    Hibernate操作持久化对象

    在Hibernate中,对象的状态分为瞬时状态、持久状态和脱管状态。瞬时状态的对象存在于内存中,但未与SessionFactory关联;持久状态的对象已经被持久化到数据库,并且可以通过SessionFactory追踪;脱管状态的对象曾经...

    Hibernate 操纵持久化对象

    Hibernate允许开发者定义对象的生命周期回调方法,如preInsert()、postInsert()、preUpdate()等,以便在对象状态改变时执行特定的业务逻辑。 **九、懒加载与立即加载** 懒加载(Lazy Loading)是一种优化策略,只在...

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

    本篇将详细阐述Hibernate中的对象三状态、一对一(OneToOne)、一对多(OneToMany)以及多对多(ManyToMany)关系映射。 一、Hibernate对象三状态 1. 游离态(Detached):对象在应用程序中创建,但尚未与Session...

    Hibernate三种状态区分

    在 Hibernate 中,对象有三种不同的状态,这些状态决定了对象与数据库之间的关联程度以及如何进行数据操作。理解这些状态对于有效地使用 Hibernate 至关重要。 1. **瞬时态(Transient)**: - 瞬时态的对象是刚刚...

    浅谈Hibernate对象状态之间的神奇转换

    Hibernate 对象状态之间的神奇转换 Hibernate 框架中对象状态之间的转换是非常重要的概念...本文详细介绍了 Hibernate 对象状态之间的神奇转换关系,希望能够帮助读者更好地理解 Hibernate 框架中的对象状态转换机制。

    Hibernate 对象的状态检索

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

    Hibernate对象的生命周期

    Hibernate对象的生命周期 Hibernate对象的生命周期 Hibernate对象的生命周期

    《深入浅出Hibernate》.pdf

    在Hibernate中,对象有三种状态:瞬时态、持久态和脱管态。通过Session的save()或persist()方法,对象可以从瞬时态变为持久态,实现持久化。update()和merge()方法则用于更新已存在的持久化对象。 六、事务处理 ...

    Hibernate Session 4种对象状态.docx

    在Java的持久化框架Hibernate中,对象的状态管理是其核心功能之一。Hibernate将对象的状态划分为四种:临时状态、持久化状态、游离状态和删除状态。这些状态反映了对象与数据库记录之间的关系,有助于理解Hibernate...

Global site tag (gtag.js) - Google Analytics