`

Hibernate merge说明

 
阅读更多

通常下面的场景会使用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=?

分享到:
评论

相关推荐

    Hibernate 注解说明文档

    **Hibernate 注解说明文档** 在Java的持久化框架中,Hibernate是备受青睐的一款,它极大地简化了数据库操作。本文档将深入探讨Hibernate注解的使用,帮助开发者更好地理解和利用这些注解来实现对象关系映射(ORM)...

    hibernate说明及demo的例子

    在这个“hibernate说明及demo的例子”中,我们将深入探讨Hibernate的核心概念和功能,并通过一个实际的示例来展示如何使用它。 一、Hibernate概述 Hibernate是一个强大的工具,它消除了JDBC代码的繁琐,提供了数据...

    Hibernate 源代码及重要说明

    此压缩包“Hibernate01_源代码及重要说明”包含了Hibernate的源代码,以及相关的重要说明,旨在帮助开发者深入理解其工作原理。 **一、Hibernate 框架概述** 1. **对象关系映射(ORM)**: ORM是Hibernate的核心,...

    Hibernate官方中文参考手册下载

    - **更新(UPDATE)**:修改对象后,调用`Session.update()`或`Session.merge()`方法更新数据库。 - **删除(DELETE)**:使用`Session.delete()`方法删除对象。 **6. HQL(Hibernate Query Language)** HQL是...

    hibernate的_CascadeType属性说明

    Hibernate的CascadeType属性说明 Hibernate框架中,CascadeType是hibernate的重要属性之一,它控制着实体之间的级联操作。CascadeType是hibernate中的枚举类型,定义了多种级联操作,包括REFRESH、PERSIST、REMOVE...

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

    - **Cascade.MERGE**:当父对象执行merge操作时,关联的子对象也会被merge。 - **Cascade.REMOVE**:当父对象执行remove操作时,关联的子对象也会被remove。 - **Cascade.REFRESH**:当父对象执行refresh操作时,...

    Hibernate 5.3.1api 文档

    Hibernate 5.3.1 API文档包含了详细的类、接口和方法说明,是开发过程中不可或缺的参考资料。以下是一些关键的知识点: 1. **Entity管理和生命周期**:Hibernate管理的对象称为Entities,它们通过@Entity注解标识。...

    Hibernate开发实战讲解(源代码)源码整理

    - 分析Session的使用,如openSession、beginTransaction、save/merge、flush、commit等方法,了解其在数据库操作中的角色。 - 探究Criteria API或HQL的使用,理解如何构建查询条件,进行数据检索。 4. 实战演练 ...

    Hibernate 详细带大量说明实例源码 精典的ORM讲解!

    在本教程中,“Hibernate 详细带大量说明实例源码 精典的ORM讲解!”涵盖了多个关键知识点,旨在通过详实的代码示例和解释,帮助开发者深入理解Hibernate的使用。 1. **对象关系映射(ORM)基础**: - Hibernate...

    hibernate 级联查询

    **标题解析:** “Hibernate 级联查询”是指在使用...以上是对“Hibernate级联查询”这一主题的详细说明,涵盖了相关概念、配置、使用示例以及可能的源码解析。由于没有具体的压缩包内容,无法提供更详细的实例分析。

    Hibernate3笔记个人记录

    10. **Hibernate.hbm.xml 相应属性说明** Hibernate 使用XML文件(如Hibernate.hbm.xml)来定义对象-关系映射。文件中包含了类名、表名、属性与列的映射、主键生成策略等信息。 11. **Hibernate 中心的核心接口与...

    Hibernate 系列教程 单表操作

    - CRUD操作的具体实现:如何通过Hibernate保存(persist)、加载(load/get)、更新(merge)和删除(delete)对象。 - HQL语言的使用,允许以面向对象的方式编写查询,而非传统的SQL。 - 可能涉及的事务管理,理解...

    Hibernate增删改查

    2. **更新(Update)**:当对象的状态发生改变,调用`Session.update()`或`Session.merge()`方法,Hibernate会检测变化并更新数据库记录。 3. **删除(Delete)**:调用`Session.delete()`方法,Hibernate会从...

    HibernateGossip_Simp.rar_hibernate教程

    - www.pudn.com.txt 文件:可能是一个链接或者资源说明,可能指向更多 Hibernate 学习资料。 总的来说,Hibernate 是 Java 开发中极为重要的工具,通过理解和掌握 Hibernate,开发者可以更高效地处理数据库操作,...

    Hibernate Core 3.3.2.GA Javadocs

    这个文档对于开发者来说是不可或缺的,因为它提供了对Hibernate ORM框架详细的功能说明和使用指南。Hibernate是一个流行的关系型数据库管理系统的对象关系映射(ORM)框架,它允许开发人员使用面向对象的方式来处理...

    hibernateAPI

    1. **HibernateAPI.chm**: 这可能是一个关于Hibernate基础API的快速参考手册,涵盖了核心接口和类的详细说明,是开发者日常查阅的好帮手。 2. **Hibernate3.1_DOC_CN.chm**: 3.1版本的中文文档,包含了完整的API参考...

    Hibernate培训教程,经典的学习教程

    "E书说明.txt"可能是关于如何阅读和使用电子书的说明,确保你能充分利用这些学习资料。 通过系统学习和实践,你将能够熟练运用Hibernate进行数据库操作,提升项目开发的效率和质量。祝你在学习过程中取得成功!

    hibernate_test5.zip

    从`SessionFactory`的创建到实体类的映射,再到CRUD操作和多表查询的实现,都有详细的注释说明。这将帮助你直观地了解每个步骤的具体实现和作用。 总结 掌握Hibernate框架的单表和多表操作是Java开发中的重要技能...

    hibernate中文文档

    这个“Hibernate3[1].2中文参考文档.chm”是针对Hibernate 3.2版本的中文文档,为开发者提供了详尽的指南和API使用说明。 ### 1. Hibernate 概述 Hibernate 提供了一个数据访问层,将业务对象与数据库表之间的映射...

    hibernate学习笔记定义.pdf

    最后,文档通过“Employee----Department”关系的说明,演示了Hibernate如何处理对象之间的关联映射,包括如何通过Hibernate.initialize()方法初始化代理对象的关联属性。这是一个重要知识点,它解决了在懒加载中...

Global site tag (gtag.js) - Google Analytics