`

Hibernate 对象 三种状态 瞬时态,持久态,脱管态 以及 save update saveOrUpdate merge等的使用

阅读更多

Hibernate的对象有3种状态,分别为:瞬时态(Transient)、 持久态(Persistent)、脱管态(Detached)。处于持久态的对象也称为PO(Persistence Object),瞬时对象和脱管对象也称为VO(Value Object)。

    *  瞬时态

    由new命令开辟内存空间的java对象,

    eg. Person person = new Person("amigo", "女");

    如果没有变量对该对象进行引用,它将被java虚拟机回收。

     瞬时对象在内存孤立存在,它是携带信息的载体,不和数据库的数据有任何关联关系,在Hibernate中,可通过session的save()或 saveOrUpdate()方法将瞬时对象与数据库相关联,并将数据对应的插入数据库中,此时该瞬时对象转变成持久化对象

    * 持久态

    处于该状态的对象在数据库中具有对应的记录,并拥有一个持久化标识。如果是用hibernate的delete()方法,对应的持久对象就变成瞬时对象,因数据库中的对应数据已被删除,该对象不再与数据库的记录关联。
    当一个session执行close()或clear()、evict()之后,持久对象变成脱管对象,此时持久对象会变成脱管对象,此时该对象虽然具有数据库识别值,但它已不在HIbernate持久层的管理之下。

    持久对象具有如下特点

    1. 和session实例关联
    2. 在数据库中有与之关联的记录

    * 脱管态

    当与某持久对象关联的session被关闭后,该持久对象转变为脱管对象。当脱管对象被重新关联到session上时,并再次转变成持久对象。
    脱管对象拥有数据库的识别值,可通过update()、saveOrUpdate()等方法,转变成持久对象

    脱管对象具有如下特点:

    1. 本质上与瞬时对象相同,在没有任何变量引用它时,JVM会在适当的时候将它回收
    2. 比瞬时对象多了一个数据库记录标识值

 

    瞬态(Transient),也叫临时态。处于这种状态的对象具备的特征如下:                          
                                                
        不在Session的缓存中,不与任何的Session实例相关联。                                     
                                                
        在数据库中没有与之相对应的记录。                                                        
                                                
    持久态(Persistent),处于这种状态的对象具备的特征如下:                                   
                                                
        在Session的缓存中,与Session实例相关联。                                               
                                                
        在数据库中存在与之相对应的记录。                                                        
                                                
    脱管态(Detached),也叫游离态。处于这种状态的对象具备的特征如下:                         
                                                
        不在Session的缓存中,不与任何的Session实例相关联。                                     
                                            
        在数据库中存在与之相对应的记录。(前提条件是没有其他Session实例删除该条记录)。           
                                        
一、预备知识
对于hibernate,它的对象有三种状态,transient、persistent、detached
下边是常见的翻译办法:
transient:瞬态或者自由态
    (new DeptPo(1,”行政部”,20,”行政相关”),该po的实例和session没有关联,该po的实例处于transient)
persistent:持久化状态
    (和数据库中记录想影射的Po实例,它的状态是persistent, 通过get和load等得到的对象都是persistent)
detached:脱管状态或者游离态
    (1)当通过get或load方法得到的po对象它们都处于persistent,但如果执行delete(po)时(但不能执行事务),该po状态就处于detached, (表示和session脱离关联),因delete而变成游离态可以通过save或saveOrUpdate()变成持久态
    (2)当把session关闭时,session缓存中的persistent的po对象也变成detached

因关闭session而变成游离态的可以通过lock、save、update变成持久态
持久态实例可以通过调用 delete()变成脱管状态。
通过get()或load()方法得到的实例都是持久化状态的。
脱管状态的实例可以通过调用lock()或者replicate()进行持久化。
save()和persist()将会引发SQL的INSERT,delete()会引发SQLDELETE,
而update()或merge()会引发SQL UPDATE。对持久化(persistent)实例的修改在刷新提交的时候会被检测到,它也会引起SQL UPDATE。
saveOrUpdate()或者replicate()会引发SQL INSERT或者UPDATE

二、save 和update区别
    把这一对放在第一位的原因是因为这一对是最常用的。
    save的作用是把一个新的对象保存
    update是把一个脱管状态的对象或自由态对象(一定要和一个记录对应)更新到数据库
三、update 和saveOrUpdate区别
    这个是比较好理解的,顾名思义,saveOrUpdate基本上就是合成了save和update,而update只是update;引用hibernate reference中的一段话来解释他们的使用场合和区别
    通常下面的场景会使用update()或saveOrUpdate():
    程序在第一个session中加载对象,接着把session关闭
    该对象被传递到表现层
    对象发生了一些改动
    该对象被返回到业务逻辑层最终到持久层
    程序创建第二session调用第二个session的update()方法持久这些改动
    saveOrUpdate(po)做下面的事:
    如果该po对象已经在本session中持久化了,在本session中执行saveOrUpdate不做任何事
    如果savaOrUpdate(新po)与另一个与本session关联的po对象拥有相同的持久化标识(identifier),抛出一个异常
    org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [org.itfuture.www.po.Xtyhb#5]
    saveOrUpdate如果对象没有持久化标识(identifier)属性,对其调用save() ,否则update() 这个对象
四、persist和save区别
    这个是最迷离的一对,表面上看起来使用哪个都行,在hibernate reference文档中也没有明确的区分他们.
    这里给出一个明确的区分。(可以跟进src看一下,虽然实现步骤类似,但是还是有细微的差别)
    主要内容区别:
    1,persist把一个瞬态的实例持久化,但是并"不保证"标识符(identifier主键对应的属性)被立刻填入到持久化实例中,标识符的填入可能被推迟到flush的时候。
    2,save, 把一个瞬态的实例持久化标识符,及时的产生,它要返回标识符,所以它会立即执行Sql insert
五、saveOrUpdate,merge和update区别
    比较update和merge
    update的作用上边说了,这里说一下merge的
    如果session中存在相同持久化标识(identifier)的实例,用用户给出的对象覆盖session已有的持久实例
    (1)当我们使用update的时候,执行完成后,会抛出异常
    (2)但当我们使用merge的时候,把处理自由态的po对象A的属性copy到session当中处于持久态的po的属性中,执行完成后原来是持久状态还是持久态,而我们提供的A还是自由态
六、flush和update区别
    这两个的区别好理解
    update操作的是在自由态或脱管状态(因session的关闭而处于脱管状态)的对象//updateSQL
    而flush是操作的在持久状态的对象。
    默认情况下,一个持久状态的对象的改动(包含set容器)是不需要update的,只要你更改了对象的值,等待hibernate flush就自动更新或保存到数据库了。hibernate flush发生在以下几种情况中:
    1, 调用某些查询的和手动flush(),session的关闭、SessionFactory关闭结合
    get()一个对象,把对象的属性进行改变,把资源关闭。
    2,transaction commit的时候(包含了flush)
七、lock和update区别
    update是把一个已经更改过的脱管状态的对象变成持久状态
    lock是把一个没有更改过的脱管状态的对象变成持久状态(针对的是因Session的关闭而处于脱管状态的po对象(2),不能针对因delete而处于脱管状态的po对象)
    对应更改一个记录的内容,两个的操作不同:
    update的操作步骤是:
    (1)属性改动后的脱管的对象的修改->调用update
    lock的操作步骤是:
    (2)调用lock把未修改的对象从脱管状态变成持久状态-->更改持久状态的对象的内容-->等待flush或者手动flush
八、clear和evcit的区别
    clear完整的清除session缓存
    evcit(obj)把某个持久化对象从session的缓存中清空。           

分享到:
评论

相关推荐

    Hibernate中对象的三种状态

    本篇将详细阐述Hibernate中的瞬时态、持久态和脱管态,以及它们之间的转换。 1. 瞬时态(Transient): 瞬时态的对象是在内存中创建的,尚未与数据库中的任何记录关联。它们没有持久化标识(ID),在Hibernate的...

    Hibernate三种状态区分

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

    hibernate三状态

    - **瞬时态 -> 持久态**:通过Session的save()、saveOrUpdate()或persist()方法,瞬时态对象会获得一个数据库生成的ID,变为持久态。 - **持久态 -> 瞬时态**:当Session关闭或调用clear()方法时,所有持久态对象...

    hibernate相关配置 3种状态

    - 如果需要再次操作这个对象,可以使用Session的get()或load()方法获取已持久化的对象,或者通过merge()或update()方法将脱管态对象变为持久态。 4. Session的作用: Session是Hibernate的核心接口,它是数据库...

    hibernate+状态详解

    首先,我们需要理解Hibernate管理的对象有三种主要状态:瞬时态(Transient)、持久态(Persistent)和脱管态(Detached)。每种状态都有其特定的特征和行为,下面分别进行阐述。 1. **瞬时态(Transient)**: 当...

    hibernate3.2生命周期

    - **脱管态到瞬时态**:直接丢弃对象,或者使用`clear()`方法清空Session缓存,对象将失去持久化ID,成为瞬时态。 ### 3. 持久化操作 - **save()**:适用于新对象,将对象插入数据库,返回一个新的ID。如果对象...

    hibernate各种常用方法的详解

    本文将详细介绍 Hibernate 中常用的几种方法,包括 `save`, `update`, `saveOrUpdate`, `merge` 等,帮助开发者更深入地理解 Hibernate 的工作原理及其使用方式。 #### 二、Hibernate 对象状态管理 在 Hibernate ...

    Hibernate教程03_Hibernate核心开发接口介绍

    Hibernate将对象分为瞬时态、持久态和脱管态。瞬时态对象未与Session关联,持久态对象与Session关联并在数据库中有对应的记录,脱管态对象曾是持久态但已从Session中清除。通过Session的save()、saveOrUpdate()、...

    Hibernate实体对象操纵

    使用Session的save()或saveOrUpdate()方法可以将瞬时态对象转换为持久态,从而插入数据库。如果对象已经存在主键,Hibernate将执行更新操作。 ```java session.save(entity); ``` #### 3.2 更新(Update) 对于...

    Hibernate入门(下)

    在Hibernate中,对象有三种状态:瞬时态、持久态和脱管态。瞬时态对象未与数据库关联,持久态对象已与数据库记录绑定,而脱管态对象曾是持久态但当前未被Session管理。通过Session的save()、update()、merge()和...

    Hibernate之API初识及增删改查实现案例hibernate003

    5. **对象状态与操作**:理解Hibernate中的对象状态(瞬时态、持久态、游离态)对于正确操作非常重要。例如,新创建的对象是瞬时态,需要通过`Session.save()`或`Session.persist()`将其变为持久态;已持久化的对象...

    Hibernate4.1.1的Demo实例

    5. **对象状态**:在Hibernate中,对象有三种状态:瞬时态、持久态和脱管态。理解这些状态对于管理对象的生命周期至关重要。 6. **CRUD操作**:在Demo中,会展示如何使用Hibernate进行基本的数据库操作。例如,通过...

    Hibernate 中文api文档下载.zip_API_Hibernate API _hibernate api

    在Hibernate中,对象的生命周期分为临时态、持久态、脱管态和瞬时态。通过Session的save()、persist()、update()、merge()和delete()方法,可以实现对象的持久化操作。 四、查询语言HQL Hibernate Query Language ...

    Hibernate笔记

    对象在 Hibernate 中有三种状态:瞬时态、持久态和脱管态。瞬时态对象未与 Session 关联,数据库中无对应记录。持久态对象与 Session 关联,且数据库中有对应记录。脱管态对象数据库中有记录,但当前与任何 Session ...

    精通hibernate源码ch6

    总结,本章详细讲解了Hibernate的持久化模型,对象状态转换,查询方式,级联操作,懒加载以及缓存策略。掌握这些知识点,有助于我们更好地利用Hibernate进行数据库操作,提升开发效率和系统性能。通过深入阅读源码,...

    Hibernate_Demo

    Hibernate管理的对象有四种状态:瞬时态、持久态、脱管态和临时态,了解这些状态有助于理解对象与数据库的关联。 7. Criteria查询: 除了HQL,Hibernate还提供了Criteria API,一种基于对象的查询方式,可以动态...

    Hibernate实战

    实体管理是Hibernate中的重要部分,书中会详细介绍如何定义实体类,使用注解来声明属性与数据库字段的映射,以及如何实现对象的生命周期管理,包括瞬时态、持久态、托管态和游离态。此外,还会讲解实体间的一对一、...

    Hibernate In Action中文版电子书

    11. **实体状态管理**:Hibernate管理的对象有瞬时态、持久态、脱管态和临时态四种状态,理解这些状态对于正确使用Hibernate至关重要。 12. **实体关系映射策略**:包括一对一(OneToOne)、一对多(OneToMany)、多对...

    Hibernate3笔记个人记录

    Hibernate 的对象有四个状态:瞬时态、持久态、托管态和脱管态。理解这些状态对于正确管理对象的生命周期至关重要,例如何时保存、更新和删除对象。 总的来说,Hibernate 提供了一套完整的解决方案,帮助开发者...

    精通hibernate

    例如,使用save()或saveOrUpdate()保存新对象,update()更新已持久化的对象,delete()移除对象,get()和load()根据主键加载对象。此外,还可用merge()将游离态对象转变为持久态。 五、查询机制 Hibernate提供HQL和...

Global site tag (gtag.js) - Google Analytics