`

hibernate的各种保存方式的区别(save,persist,update,saveOrUpdte,merge,flush,lock) hibernate

 
阅读更多

hibernate 的各种保存方式的区别(save,persist,update,saveOrUpdte,merge,flush,lock)

hibernate 的保存

一、准备知识

对于hibernate ,它的对象有三种状态,transientpersistentdetached

transient :瞬态或者自由态

(new DeptPo(1,” 行政部”,20,” 行政相关”) ,该po 的实例和session 没有关联,该po 的实例处于transient)

persistent :持久化状态

( 和数据库中记录相影射的Po 实例,它的状态是persistent, 通过getload 等得到的对象都是persistent)

detached :脱管状态或者游离态

    (1) 当通过getload 方法得到的po 对象它们都处于persistent, 但如果执行delete(po)( 但不能执行事务),po 状态就处于detached, ( 表示和session 脱离关联),delete 而变成游离态可以通过savesaveOrUpdate() 变成持久态

(2) 当把session 关闭时,session 一级缓存中的persistentpo 对象也变成detached

因关闭session 而变成游离态的可以通过locksaveupdate 等变成持久态

持久态 实例可以通过调用 delete() 变成脱管状态( 游离态)

通过get()load() 方法得到的实例都是持久化状态的。

脱管状态的实例可以通过调用lock() 或者replicate() 进行持久化。

 

save() persist() 将会引发SQLINSERTdelete() 会引发SQLDELETE

update()merge() 会引发SQL UPDATE 。对持久化(persistent )实例属性的修改在刷新提交的时候会被检测到,它也会引起SQL UPDATE

saveOrUpdate() 或者replicate() 会引发SQLINSERT 或者UPDATE

二、save update 区别

把这一对放在第一位的原因是因为这一对是最常用的。

save 的作用是把一个新的对象( 自由态) 保存

update 是把一个脱管状态的对象或自由态对象(一定要和一个记录对应)更新到数据库,也就是说把对象(脱管状态的对象自由态对象 )变成持久态

 

三、update saveOrUpdate 区别

这个是比较好理解的,顾名思义,saveOrUpdate 基本上就是合成了saveupdate,update 只是update; 引用hibernate reference 中的一段话来解释他们的使用场合和区别

通常下面的场景会使用update()saveOrUpdate()

程序在第一个session 中加载对象, 接着把session 关闭

该对象被传递到表现层

对象发生了一些改动

该对象被返回到业务逻辑层最终到持久层

程序创建第二session 调用第二个sessionupdate() 方法持久 这些改动

 

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() 这个对象

 

四、persistsave 区别

这个是最迷离的一对,表面上看起来使用哪个都行,在hibernate reference 文档中也没有明确的区分他们.

这里给出一个明确的区分。(可以跟进src 看一下,虽然实现步骤类似,但是还是有细微的差别)

主要内容区别:

1 persist 把一个瞬态的实例持久化,但是并" 不保证" 标识符(identifier 主键对应的属性) 被立刻填入到持久化实例中,标识符的填入可能被推迟到flush 的时候。

2 save, 把一个瞬态的实例持久化; 标识符及时的产生, 它要返回标识符,所以它会立即执行Sql insert

 

五、saveOrUpdate,mergeupdate 区别

比较updatemerge

update 的作用上边说了,这里说一下merge

如果session 中存在相同持久化标识(identifier) 的实例 ,用户给出新的对象( 自由态) 覆盖session 已有的持久实例的属性

(1) 当我们使用update 的时候,执行完成后,会抛出异常

(2) 但当我们使用merge 的时候,把处于自由态的po 对象A 的属性copysession 当中处于持久态的po 属性中,执行完成后原来是持久状态还是持久态,而我们提供的A 还是自由态

 

六、flushupdate 区别

这两个的区别好理解

update 操作的是在自由态或脱管状态(session 的关闭而处于脱管状态) 的对象,

接着会产生updateSQL 动作

flush 是操作是持久状态的对象。

默认情况下,一个持久状态的对象的改动(包含set 容器)是不需要update 的,只要你更改了对象的值,等待hibernate flush 就自动更新或保存到数据库了。hibernate flush 发生在以下几种情况中:

1 、手动flush()

2 transaction commit 的时候(包含了flush

 

七、lockupdate 区别

Update 是把一个已经更改过 的脱管状态的对象变成持久状态

lock   是把一个没有更改过的脱管状态 的对象变成持久状态( 针对的是因Session 的关闭而处于脱管状态的po 对象,不能针对因delete 而处于脱管状态的po 对象)

update 的操作步骤是:

(1) 属性改动后的脱管的对象的修改-> 调用update

lock update 关联:

(2) 调用lock 把未修改的对象从脱管状态 变成持久状态--> 更改持久状态的对象的内容--> 等待flush 或者手动flush

八、clearevcit 的区别

    clear 完整的清除session 缓存

   evcit(obj) 把某个持久化对象从session 的缓存中清空。

 

Lock 把游离态的对象变成持久态

ssion.lock(xtyhb,LockMode.NONE);// 表示直接把游离态对象变成持久态的对象

session.lock(xtyhb,LockMode.READ);// 先通过 ID 读数据库该记录的 ID 看是否有该记录,如果有接着才把该游离态对象变成持久态的对象

 

replicate 把游离态的对象变成持久态

session .replicate(cardid, ReplicationMode. IGNORE ); // 忽略复制

session .replicate(cardid, ReplicationMode. OVERWRITE ); // 根据游离态的对象复制一个对象到 session 的一级缓存中 , 实际上是又根据游离态对象产生了一个持久态的对象

分享到:
评论

相关推荐

    Hibernate save persist merge探究

    《Hibernate的save、persist、merge深度解析》 在Java企业级开发中,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。本文将深入探讨Hibernate中的save、persist和merge这三个方法,帮助...

    hibernate的各种保存方式的区别

    ### Hibernate的各种保存方式的区别 #### 一、预备知识 在深入了解Hibernate中各种保存方式之前,我们需要先了解对象在Hibernate中的几种状态。对于Hibernate而言,对象的状态主要包括以下三种: 1. **瞬态...

    save, saveOrUpdate, persist, merge, update 区别.docx

    在Java的持久化框架Hibernate中,管理对象与数据库之间的交互是通过一系列的方法完成的,其中包括`save()`, `saveOrUpdate()`, `persist()`, `merge()`, 和 `update()`。这些方法各有其特点和适用场景,理解它们的...

    Hibernate的各种保存方式的区别详解

    Hibernate提供了多种保存方式,包括save()、persist()、update()、saveOrUpdate()等,了解这些方法的区别非常重要,以便正确使用它们。本文将对Hibernate的各种保存方式进行详细的比较和分析。 一、预备知识 在...

    hibernate的各种保存方式的区别以及hibernate对象的三种状态[定义].pdf

    在Hibernate框架中,对象的保存和管理涉及到多种方法和对象状态。以下是关于这些知识点的详细说明: 1. Hibernate对象的三种状态: - Transient(瞬态):这是对象的初始状态,对象在内存中独立存在,没有与任何...

    Hibernate_级联关系说明_-_关于cascade和inverse的用法

    @org.hibernate.annotations.Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE}) private User user; ``` 在上面的例子中,我们设置了`inverse=true`,这意味着 `Address` 实体不再负责维护与 `User` ...

    Hibernate:有了 save,为什么还需要 persist?.docx

    `save` 和 `persist` 是Hibernate Session接口中的两个方法,它们都用于将瞬时对象(transient instance)转化为持久化对象(persistent instance)。然而,它们在行为上存在微妙的差别,这使得在某些场景下,`...

    hibernate各种常用方法的详解

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

    Hibernate三种状态区分

    Hibernate 是一个流行的 Java ORM(对象关系映射)框架,它允许开发者以面向对象的方式操作数据库。在 Hibernate 中,对象有三种不同的状态,这些状态决定了对象与数据库之间的关联程度以及如何进行数据操作。理解...

    java Hibernate save()与persist()区别

    在Java的持久化框架Hibernate中,`save()` 和 `persist()` 都是用来将瞬态(Transient)对象转化为持久化(Persistent)对象的方法,使得对象的状态能够被存储到数据库中。然而,两者之间存在一些关键的区别,这对于...

    Hibernate所需架包

    5. 使用Session进行CRUD操作,例如保存(save或persist)、更新(update)、删除(delete)和查询(query)。 了解和熟练使用这些架包是掌握Hibernate的关键。同时,开发者应根据实际项目需求选择合适的库,以保证...

    Hibernate中po对象的三种状态分析[借鉴].pdf

    2. **Hibernate的保存方式** - **save()**:用于保存新的瞬态对象,生成新的主键并将其设置到对象中。如果对象已经存在持久化标识,可能会引发异常。 - **persist()**:同样用于保存瞬态对象,但不保证立即生成...

    hibernate_reference中文版和Hibernate中文手册

    5. CRUD操作:Hibernate提供了便捷的方法来完成创建(save()、persist())、读取(get()、load()、query())、更新(update()、merge())和删除(delete())对象的操作。其中,HQL(Hibernate Query Language)和...

    Hibernate持久化对象的生命周期

    Session的多种方法如`save()`, `load()`, `get()`, `find()`, `update()`, `saveOrUpdate()`, `lock()`等可以将对象转变为持久化状态。 3. **离线对象(Detached Objects)**: - 离线对象是曾经是持久化对象,但...

    HibernateDemo(hibernate基本用法演示)

    - **创建(Create)**:使用 `Session` 的 `save()` 或 `persist()` 方法保存新实体到数据库。 - **读取(Read)**:通过 `get()` 或 `load()` 获取单个实体,`createQuery()` 或 `createSQLQuery()` 执行 HQL...

    hibernate第一个hibernate

    - 创建(Create):使用`Session.save()`或`Session.persist()`方法将对象持久化到数据库。 - 读取(Read):`Session.get()`或`Session.load()`用于根据主键获取对象,而`Query`或`Criteria`接口则支持更复杂的...

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

    - **创建(Create)**:`Session.save()`或`Session.persist()`方法用于将对象保存到数据库,生成新的主键。 - **读取(Read)**:通过`Session.get()`、`Session.load()`或Criteria查询获取数据库中的对象。 - *...

    Hibernate官方中文参考手册下载

    - **创建(CREATE)**:使用`Session.save()`或`Session.persist()`方法将对象保存到数据库。 - **读取(READ)**:`Session.get()`或`Session.load()`用于根据主键获取对象,`Query`和`Criteria`接口提供了更复杂的查询...

    西安领航核心项目Hibernate部分重点、难点总结

    ### Persist、Save、Merge和Update方法的区别 - **Persist和Save**:两者相似,用于将瞬时对象变为持久化对象。 - **Merge和Update**:Merge可以将离线对象的状态合并到Session中,如果存在ID冲突,会更新原有对象...

Global site tag (gtag.js) - Google Analytics