`

hibernate merge和saveorupdate、persist和save

阅读更多

    一直很纳闷这个merge和persist方法,平时也很少用。今天研究下总结下

    一、merge  翻译:合并;融合

 

          其实merge方法很简单,看代码。

         

@Entity
public class Father {
	@Id @GeneratedValue
	private int id;
	
	private String name;

 

    唯一一个father实体类,执行session.merge(father)方法时,首先会查看father的id是否为空,

    1.要是为空的话那就直接执行insert语句将father持久化,结束。

    2.要是不为空,那么先执行select的语句查询father表中id为这个father.id的记录是否存在

                   A:存在,那好执行update语句,结束。

                   B:不存在,那么执行inset语句,结束。

     很简单吧。

     但是有一点要注意,看代码;

@Test
	public void testChildSave() {
		Father f = new Father();
		f.setId(7);
		f.setName("父亲1");
				
		Session session = sessionFactory.getCurrentSession();
		session.beginTransaction();
		session.merge(f);
		session.getTransaction().commit();
		
		System.out.println(f.getId());

	}

 先说明在执行这段代码之前,father表没有任何记录。 按照上面的流程,先执行select语句,然后执行insert语句

这是控制台给出的hibernate的sql语句

Hibernate: 
    select
        father0_.id as id1_0_,
        father0_.name as name1_0_ 
    from
        Father father0_ 
    where
        father0_.id=?
Hibernate: 
    insert 
    into
        Father
        (name) 
    values
        (?)
7

  注意看最后的一个7,这是我们之前set的id,但是数据库的记录下对应的id是1;也就是说father对象经过merge方法后没有任何的变化,一直是一个transient状态。所以要注意,一个对象经过merge后它和数据库不一定一致。

  现在我们来看看saveorupdate方法,这个方法也很简单,它会根据对象的id是否为空来决定进行inset或者update,

为空就inset,不为空就update,任何情况下都不会执行select语句,所以在update一个数据库不存在的id时会有Exception。

 

二、未完待续- - !

分享到:
评论

相关推荐

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

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

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

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

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

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

    Hibernate 映射关系! 基础封装

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

    hibernate三态详解.doc

    Hibernate 提供了多种方法来保存对象,包括 `save()`, `persist()`, `update()`, `saveOrUpdate()`, `merge()` 和 `lock()`。这些方法在不同场景下有不同的作用: - `save()` 和 `persist()`:两者都可以将对象持久...

    hibernate各种常用方法的详解

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

    ORM hibernate。jar包

    8. **实体生命周期**:包括瞬态、持久化、托管和游离状态的转换,例如,通过Session的save()、saveOrUpdate()、persist()方法可以使对象进入持久化状态,update()和merge()方法用于更新已存在的实体。 9. **事件...

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

    **标题:“Hibernate之API初识及增删改查实现案例hibernate...综上所述,这个案例教程对于初学者来说是一个很好的起点,通过实际操作,可以掌握Hibernate的基本用法,为进一步深入学习和应用Hibernate打下坚实的基础。

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

    通过Session的save()、persist()、update()、merge()和delete()方法,可以实现对象的持久化操作。 四、查询语言HQL Hibernate Query Language (HQL) 是一种面向对象的查询语言,类似于SQL,但更符合面向对象的思维...

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

    ### Save和SaveOrUpdate方法的区别 - **Save方法**:用于保存瞬时对象。如果尝试对已存在ID的对象使用此方法,不会更新现有记录,而是新增一条记录。 - **SaveOrUpdate方法**:更灵活,能根据对象状态决定是否插入...

    Hibernate三种状态区分

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

    Hibernate 对象的三种状态和特点

    如果想要使对象进入持久状态,需要通过Session的`save()`、`saveOrUpdate()`或`persist()`方法。 2) 持久状态(Persistent State): 一旦对象通过Session的`save()`, `update()`, `load()`等方法被管理,它就会...

    HIbernate免注解实现操作数据库 及Hibernate3连接SQL的BUG解决办法

    例如,通过`save()`或`saveOrUpdate()`方法保存实体,`get()`或`load()`方法获取实体,`update()`更新实体,`delete()`删除实体。 6. **事务管理**: 数据库操作通常需要在事务中进行,使用Session的`begin...

    hibernate的各种保存方式的区别

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

    Hibernate中对象的三种状态

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

    Hibernate笔记

    - `persist()`和`save()`功能相似,但在没有事务时,`save()`会立即保存数据并回滚,而`persist()`在无事务时不会保存。 9. Hibernate对象状态: - 瞬时(transient):对象未与Session关联,数据库中无对应记录...

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

    - saveOrUpdate():这是一个合并save()和update()功能的方法。如果对象是新的,它将执行INSERT,如果对象已经存在于数据库中,它将执行UPDATE。 - merge():此方法将游离对象的状态合并到持久化对象中,如果对象...

    Hibernate的Session的javadoc

    Hibernate的Session接口是Java应用程序与Hibernate之间主要的运行时交互接口,它提供了对持久化对象的创建、读取和删除操作。Session的概念是基于对象的状态管理和数据库事务的,它的生命周期通常与一个物理事务绑定...

    hibernate学习笔记

    - `save()`和`persist()`:`save()`在事务中直接插入数据,而`persist()`仅标记对象为持久化,可能不会立即插入。 8. **对象状态** - **瞬时状态**:对象未与Session关联,数据库中无对应记录。 - **持久状态**...

    Hibernate持久化对象的生命周期

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

Global site tag (gtag.js) - Google Analytics