一直很纳闷这个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。
二、未完待续- - !
分享到:
相关推荐
在Java的持久化框架Hibernate中,管理对象与数据库之间的交互是通过一系列的方法完成的,其中包括`save()`, `saveOrUpdate()`, `persist()`, `merge()`, 和 `update()`。这些方法各有其特点和适用场景,理解它们的...
2. **持久化状态(Persistent)**:一旦Hibernate通过`Session`对象的`save()`、`persist()`或`merge()`方法将瞬时对象与数据库记录绑定,对象就进入了持久化状态。此时,对象的任何变化都会在下次提交事务时同步到...
Hibernate提供了多种保存方式,包括save()、persist()、update()、saveOrUpdate()等,了解这些方法的区别非常重要,以便正确使用它们。本文将对Hibernate的各种保存方式进行详细的比较和分析。 一、预备知识 在...
`save()`、`update()`、`saveOrUpdate()`、`persist()`和`merge()`是Hibernate中用于处理对象状态变化的主要方法。 - **save()**:保存一个新的瞬态对象到数据库,生成并返回主键标识符。如果对象已存在,可能会...
Hibernate 提供了多种方法来保存对象,包括 `save()`, `persist()`, `update()`, `saveOrUpdate()`, `merge()` 和 `lock()`。这些方法在不同场景下有不同的作用: - `save()` 和 `persist()`:两者都可以将对象持久...
本文将详细介绍 Hibernate 中常用的几种方法,包括 `save`, `update`, `saveOrUpdate`, `merge` 等,帮助开发者更深入地理解 Hibernate 的工作原理及其使用方式。 #### 二、Hibernate 对象状态管理 在 Hibernate ...
8. **实体生命周期**:包括瞬态、持久化、托管和游离状态的转换,例如,通过Session的save()、saveOrUpdate()、persist()方法可以使对象进入持久化状态,update()和merge()方法用于更新已存在的实体。 9. **事件...
**标题:“Hibernate之API初识及增删改查实现案例hibernate...综上所述,这个案例教程对于初学者来说是一个很好的起点,通过实际操作,可以掌握Hibernate的基本用法,为进一步深入学习和应用Hibernate打下坚实的基础。
通过Session的save()、persist()、update()、merge()和delete()方法,可以实现对象的持久化操作。 四、查询语言HQL Hibernate Query Language (HQL) 是一种面向对象的查询语言,类似于SQL,但更符合面向对象的思维...
### Save和SaveOrUpdate方法的区别 - **Save方法**:用于保存瞬时对象。如果尝试对已存在ID的对象使用此方法,不会更新现有记录,而是新增一条记录。 - **SaveOrUpdate方法**:更灵活,能根据对象状态决定是否插入...
- Hibernate 提供了 `save()` 或 `saveOrUpdate()` 方法,可以将瞬时对象转换为持久态,即在数据库中创建相应的记录,并为对象分配一个唯一的持久化标识。 2. **持久态(Persistent)**: - 持久态对象在数据库中有...
如果想要使对象进入持久状态,需要通过Session的`save()`、`saveOrUpdate()`或`persist()`方法。 2) 持久状态(Persistent State): 一旦对象通过Session的`save()`, `update()`, `load()`等方法被管理,它就会...
例如,通过`save()`或`saveOrUpdate()`方法保存实体,`get()`或`load()`方法获取实体,`update()`更新实体,`delete()`删除实体。 6. **事务管理**: 数据库操作通常需要在事务中进行,使用Session的`begin...
- **持久状态(Persistent)**:当一个对象与`Session`关联后,并且已经通过`Session`的方法如`save()`、`persist()`或`saveOrUpdate()`等进行保存操作后,该对象就处于持久状态。这意味着该对象的数据会被持久化到...
本篇将详细阐述Hibernate中的瞬时态、持久态和脱管态,以及它们之间的转换。 1. 瞬时态(Transient): 瞬时态的对象是在内存中创建的,尚未与数据库中的任何记录关联。它们没有持久化标识(ID),在Hibernate的...
- `persist()`和`save()`功能相似,但在没有事务时,`save()`会立即保存数据并回滚,而`persist()`在无事务时不会保存。 9. Hibernate对象状态: - 瞬时(transient):对象未与Session关联,数据库中无对应记录...
- saveOrUpdate():这是一个合并save()和update()功能的方法。如果对象是新的,它将执行INSERT,如果对象已经存在于数据库中,它将执行UPDATE。 - merge():此方法将游离对象的状态合并到持久化对象中,如果对象...
Hibernate的Session接口是Java应用程序与Hibernate之间主要的运行时交互接口,它提供了对持久化对象的创建、读取和删除操作。Session的概念是基于对象的状态管理和数据库事务的,它的生命周期通常与一个物理事务绑定...
- `save()`和`persist()`:`save()`在事务中直接插入数据,而`persist()`仅标记对象为持久化,可能不会立即插入。 8. **对象状态** - **瞬时状态**:对象未与Session关联,数据库中无对应记录。 - **持久状态**...
Session的多种方法如`save()`, `load()`, `get()`, `find()`, `update()`, `saveOrUpdate()`, `lock()`等可以将对象转变为持久化状态。 3. **离线对象(Detached Objects)**: - 离线对象是曾经是持久化对象,但...