`
旷世cC
  • 浏览: 25622 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

Hibernate merge、update与saveOrUpdate方法的区别

 
阅读更多
通常下面的场景会使用update()或saveOrUpdate():


程序在第一个session中加载对象
该对象被传递到表现层
对象发生了一些改动
该对象被返回到业务逻辑层
程序调用第二个session的update()方法持久这些改动

saveOrUpdate()做下面的事:


如果对象已经在本session中持久化了,不做任何事
如果另一个与本session关联的对象拥有相同的持久化标识(identifier),抛出一个异常
如果对象没有持久化标识(identifier)属性,对其调用save()
如果对象的持久标识(identifier)表明其是一个新实例化的对象,对其调用save()
如果对象是附带版本信息的(通过<version>或<timestamp>) 并且版本属性的值表明其是一个新实例化的对象,save()它。
否则update() 这个对象


merge()可非常不同:


如果session中存在相同持久化标识(identifier)的实例,用用户给出的对象的状态覆盖旧有的持久实例
如果session没有相应的持久实例,则尝试从数据库中加载,或创建新的持久化实例
最后返回该持久实例
用户给出的这个对象没有被关联到session上,它依旧是脱管的


update和merge方法,例子
1. 数据库记录已存在,更改person的name为一个新的name。

merge方法打印出的日志如下:
Hibernate: select person0_.id as id0_0_, person0_.name as name0_0_ from person person0_ where person0_.id=?
Hibernate: update person set name=? where id=?

update方法打印出的日志如下:
Hibernate: update person set name=? where id=?

2. 数据库记录已存在,更改person的name和数据库里对应id记录的name一样的值。

merge方法打印出的日志如下:
Hibernate: select person0_.id as id0_0_, person0_.name as name0_0_ from person person0_ where person0_.id=?
此处相对于第一种情形少了update的动作

update方法打印出的日志如下:
Hibernate: update person set name=? where id=?

3. 数据库记录不存在时,也就是你传的实体bean的ID在数据库没有对应的记录。

merge方法打印出的日志如下:
Hibernate: select person0_.id as id0_0_, person0_.name as name0_0_ from person person0_ where person0_.id=?
Hibernate: insert into person (name) values (?)
如果没有对应的记录,merge会把该记录当作新的记录来插入。此处我很疑惑,因为我传得person实体对象里写明了id值的,它为什么还会做插入的动作呢?

update方法打印出的日志如下:
Hibernate: update person set name=? where id=?
[转于]http://cp3.iteye.com/blog/786019
分享到:
评论

相关推荐

    05_传智播客hibernate教程_实体对象的三种状态与saveOrUpdate方法

    2. **持久化状态(Persistent)**:一旦Hibernate通过`Session`对象的`save()`、`persist()`或`merge()`方法将瞬时对象与数据库记录绑定,对象就进入了持久化状态。此时,对象的任何变化都会在下次提交事务时同步到...

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

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

    merge的注意事项

    在探讨“merge的注意事项”这一主题时,我们深入解析Hibernate框架中merge操作的特性与应用场景,以及它与其他数据持久化方法的区别,特别是与saveOrUpdate函数的对比。这不仅有助于理解Hibernate的核心机制,还能...

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

    - 可以通过 `Session` 的 `update()`、`saveOrUpdate()` 或 `merge()` 方法将脱管对象重新关联到 `Session`,并更新为持久对象。 **保存方法的区别:** - **save()**: 用于将瞬时对象持久化,如果对象已经具有...

    hibernate各种常用方法的详解

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

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

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

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

    4. update()和saveOrUpdate()的区别: - update()仅用于更新数据库中的对象,对象必须有持久化标识。 - saveOrUpdate()则更智能,它会根据对象是否有持久化标识和版本信息来决定是执行INSERT还是UPDATE。 理解...

    hibernate的各种保存方式的区别

    - **持久状态(Persistent)**:当一个对象与`Session`关联后,并且已经通过`Session`的方法如`save()`、`persist()`或`saveOrUpdate()`等进行保存操作后,该对象就处于持久状态。这意味着该对象的数据会被持久化到...

    Hibernate三种状态

    脱管对象可以通过Session的merge()方法重新与Session关联,使其变回持久状态,或者通过update()或saveOrUpdate()方法将更改同步到数据库。 转换关系如下: 1. 瞬时对象可以通过Session的save()或saveOrUpdate()方法...

    Hibernate三种状态区分

    - Hibernate 提供了 `save()` 或 `saveOrUpdate()` 方法,可以将瞬时对象转换为持久态,即在数据库中创建相应的记录,并为对象分配一个唯一的持久化标识。 2. **持久态(Persistent)**: - 持久态对象在数据库中有...

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

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

    Hibernate实战

    这涉及到使用Session的save()、saveOrUpdate()、load()、get()、update()、merge()和delete()方法。同时,还会讨论事务管理和并发控制,确保数据的一致性和完整性。 查询语言在Hibernate中主要有两种:HQL...

    Hibernate4.1.1的Demo实例

    例如,通过Session的save()或saveOrUpdate()方法创建新记录,get()或load()方法读取记录,update()或merge()更新记录,以及delete()删除记录。 7. **HQL(Hibernate Query Language)**:这是Hibernate提供的SQL的...

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

    通过Session的save()、saveOrUpdate()、merge()和update()方法,可以改变对象的状态。 7. **缓存机制**: Hibernate内置了一级缓存和二级缓存。一级缓存是Session级别的,自动管理实体对象的缓存,提高性能。二级...

    hibernate--3.Hibernate数据持久化(通过 Session 操纵对象)

    `update()`方法适用于对象已经存在于持久化上下文的情况,而`merge()`则会复制当前对象的状态到持久化的副本,即使原对象未被持久化。 删除对象时,使用`delete()`方法。例如: ```java session.delete(entity); `...

    hibernate3.6框架中文文档

    例如,使用save()或saveOrUpdate()方法插入数据,使用get()或load()方法加载数据,使用update()或merge()方法更新数据,使用delete()方法删除数据。 6. **HQL和Criteria查询**: Hibernate提供了自己的查询语言HQL,...

    Hibernate 映射关系! 基础封装

    `save()`、`update()`、`saveOrUpdate()`、`persist()`和`merge()`是Hibernate中用于处理对象状态变化的主要方法。 - **save()**:保存一个新的瞬态对象到数据库,生成并返回主键标识符。如果对象已存在,可能会...

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

    3. **Session接口**:Session是Hibernate的工作单元,相当于JDBC中的Connection,它提供了与数据库交互的方法,如开始和结束事务、保存、更新、删除对象等。在每次业务操作前后,都需要打开和关闭Session。 4. **...

Global site tag (gtag.js) - Google Analytics