工作四年多了,以前也用过hibernate中的merge方法,但一直也没深入了解过,这次研究了下,记录下来,方便自己以后查阅:
1、调用merge(obj)方法后,obj仍然是detatch状态,而不是像save,或者update方法,直接变为Persistent状态,但在大部分功能上相当于saveorupdate()方法;
2、需要注意的是,先看下面例子:
Session session = this.getSession();
Transaction tr = session.beginTransaction();
User exituser = (User)session.get(User.class, new Integer(1));
tr.commit();
session.close();
session = getSession();
tr = session.beginTransaction();
User exituser2 = (User)session.get(User.class, new Integer(1));
session.update(exituser);
tr.commit();
session.close();
运行上面的代码,hibernate给我们报了一个错误:a different object with the same identifier value was already associated with the session。意思是,在session缓存中以两个标识相同的对象,这是不可以的。那么,吧update改成merge会怎么样呢?改为merge后,一切OK,运行正常,其实merge在执行更新之前会将两个标识符相同的对象进行合并,具体合并的方向是向exituser2合并,exituser还是detatch状态,exituser2还是persistent状态。
3、还要注意的是,merge方法是使用代理对象,所以必须在事务管理中调用
注意:merge方法在执行之前都回去缓存中找是不是有相应的记录,也就是会有一条select语句,执行改语句的目的是为了判断该对象是否被修改了。而update就不管这些,直接就一条update语句。
分享到:
相关推荐
在 Hibernate 中,merge 方法是非常重要的一个方法,它能够帮助开发者轻松地处理数据的更新和插入操作。那么,merge 方法到底如何工作的呢?下面,我们将对 merge 方法进行详细的解释。 首先,merge 方法是一个可以...
本文将深入探讨Hibernate中的save、persist和merge这三个方法,帮助开发者更好地理解它们的用法和内在机制。 一、save()方法 save()是Hibernate早期版本中最常用的方法,用于将对象持久化到数据库中。当调用Session...
综上所述,`merge()`方法是Hibernate中处理对象状态转换和数据同步的重要工具。它能够处理各种对象状态,确保数据的一致性和完整性,同时避免了可能的冲突。在设计和实现业务逻辑时,理解并正确使用`merge()`对于...
在Hibernate框架中,`merge`、`update`与`saveOrUpdate`这三个方法都是用于更新或保存实体对象到数据库中的,但它们之间存在着重要的区别,这些区别主要体现在对实体状态的处理方式上。 #### 1. `merge` 方法 `...
在探讨“merge的注意事项”这一主题时,我们深入解析Hibernate框架中merge操作的特性与应用场景,以及它与其他数据持久化方法的区别,特别是与saveOrUpdate函数的对比。这不仅有助于理解Hibernate的核心机制,还能...
例如,使用`save()`或`persist()`方法创建新对象,`load()`或`get()`方法读取对象,`update()`或`merge()`方法更新对象,以及`delete()`方法删除对象。 3. 查询语言(HQL):Hibernate查询语言,类似于SQL,但面向...
Hibernate中session的merge以及update方法
例如,使用`save()`或`saveOrUpdate()`方法保存实体,`load()`或`get()`方法获取实体,`update()`或`merge()`更新实体,以及`delete()`方法删除实体。 事务处理是数据库操作的重要部分,Hibernate通过`Transaction`...
本文将详细介绍 Hibernate 中常用的几种方法,包括 `save`, `update`, `saveOrUpdate`, `merge` 等,帮助开发者更深入地理解 Hibernate 的工作原理及其使用方式。 #### 二、Hibernate 对象状态管理 在 Hibernate ...
5. CRUD操作:Hibernate提供了便捷的方法来完成创建(save()、persist())、读取(get()、load()、query())、更新(update()、merge())和删除(delete())对象的操作。其中,HQL(Hibernate Query Language)和...
- **更新(UPDATE)**:修改对象后,调用`Session.update()`或`Session.merge()`方法更新数据库。 - **删除(DELETE)**:使用`Session.delete()`方法删除对象。 **6. HQL(Hibernate Query Language)** HQL是...
* 使用 session.merge(object),Hibernate 里面自带的方法,推荐使用。 了解 Hibernate 中的常见异常是非常重要的。通过了解这些异常的原因和解决方案,我们可以更好地使用 Hibernate,提高开发效率和质量。
`merge` 方法则是 Hibernate 中用于将游离状态的对象合并到持久化状态的过程。它的主要职责如下: 1. **保存新对象**:如果传入的对象是未保存的新对象(unsaved),`merge` 方法会创建该对象的一个拷贝,并调用 `...
`save()`方法将瞬时对象变为持久化,`persist()`、`merge()`和`update()`用于更新对象,`delete()`用于删除对象。 六、查询语言(HQL) Hibernate提供了一种面向对象的查询语言HQL,类似于SQL但更贴近Java对象。HQL...
例如,使用save()或saveOrUpdate()方法插入数据,使用get()或load()方法加载数据,使用update()或merge()方法更新数据,使用delete()方法删除数据。 6. **HQL和Criteria查询**: Hibernate提供了自己的查询语言HQL,...
可以通过Session的`save()`, `saveOrUpdate()`, `merge()`等方法将临时状态的对象转换为持久化状态。 3. **游离状态(Detached)**:游离状态的实体对象已经离开了Session的管理,但它的主键ID仍然与数据库中的一条...
在Java的持久化框架Hibernate中,对象的状态管理是其核心特性之一。理解并掌握对象的三种状态对于开发高效、稳定的数据库应用至关重要。本篇将详细阐述Hibernate中的瞬时态、持久态和脱管态,以及它们之间的转换。 ...
这涉及到使用Session的save()、saveOrUpdate()、load()、get()、update()、merge()和delete()方法。同时,还会讨论事务管理和并发控制,确保数据的一致性和完整性。 查询语言在Hibernate中主要有两种:HQL...
通过Session的save()、persist()、update()、merge()和delete()方法,可以实现对象的持久化操作。 四、查询语言HQL Hibernate Query Language (HQL) 是一种面向对象的查询语言,类似于SQL,但更符合面向对象的思维...
以下是 Hibernate 中对象的三种状态以及相关的保存方法: 1. **瞬时对象(Transient Objects)** - 当使用 `new` 关键字创建一个对象时,它处于瞬时状态。这种状态的对象与数据库中的任何记录没有关联,只存在于...