session.merge ()方法
该方法将修改表中记录,其所需要的实体状态为脱管状态,但是注意,它并不影响调用方法前后的状态,也即该实体依然是脱管状,见例6.4。
例6.4:session.merge ()方法对状态的变化
public void run() {
//创建UserInfo实例
UserInfo userInfo = new UserInfo();
//使之成为脱管状态
userInfo.setId(11112);
userInfo.setName("RW3");
userInfo.setSex("M");
//创建UserInfo实例
UserInfo userInfo2 = new UserInfo();
//使之成为脱管状态
userInfo2.setId(11112);
userInfo2.setName("RW4");
userInfo2.setSex("F");
//启动Session
Session session = HibernateSessionFactory.currentSession();
//启动事务
Transaction tx = session.beginTransaction();
//调用merge方法,此时UserInfo实体状态并没有被持久化
session.merge(userInfo);
//调用merge方法后,此时UserInfo2实体状态并没有被持久化,但是数据库中的记录被更新了.
①session.merge(userInfo2);
//merge方法与update方法的差别在于针对同样的操作update方法会报错
//原因在于update方法使得实体状态成为了持久化状态,而Session中不允许两个持久化实体有同样的持久化标识
②//session.update(userInfo);
//session.update(userInfo2);
//以下两句不会发送SQL,因为userInfo2不是持久化状态的实体
③userInfo2.setName("RW5");
userInfo2.setSex("M");
//提交事务
tx.commit();
//关闭Hibernate Session
HibernateSessionFactory.closeSession();
}
针对该段代码将执行如下SQL语句:
Hibernate:
/* ①session.merge(userInfo2)的动作 */
select
userinfo0_.id as id0_0_,
userinfo0_.NAME as NAME0_0_,
userinfo0_.SEX as SEX0_0_,
userinfo0_.roomid as roomid0_0_
from
userinfo userinfo0_
where
userinfo0_.id=?
Hibernate:
/* ①session.merge(userInfo2)的动作 */
update
userinfo
set
NAME=?,
SEX=?,
roomid=?
where
id=?
session.merge()方法会首先发送一句select语句,去数据库端获取UserInfo持久化标识所对应的表记录;然后自动生成一个持久化状态的UserInfo实体,与脱管状态的UserInfo实体做比较是否有所改变;一旦发生了改变,才会发送update语句执行更新。而按执行顺序,若两句session.merge()方法针对同一个脱管状态的UserInfo实体,那其结果只会执行最后一个session.merge()方法所发出的update语句。
即使执行了session.merge()方法,UserInfo实体依然是脱管状态,因此③userInfo2. setName("RW5")的语句不会同步数据库中的表。
分享到:
相关推荐
Hibernate中session的merge以及update方法
另外,`Session`还有一系列方法用于处理对象的状态转换,如`lock()`、`merge()`、`refresh()`、`evict()`等,这些方法在处理对象生命周期的不同阶段时非常关键。 `Configuration`和`SessionFactory`也是Hibernate的...
在第二个 Session 中,我们使用相同的 ID 从数据库中获取了一个 Students 对象,并使用 merge 方法将第一个 Session 中的对象数据赋值给第二个 Session 中的对象。 需要注意的是,在使用 merge 方法时,我们需要...
要将脱管对象重新变为持久化,可以使用`Session.merge()`方法。`merge()`会复制脱管对象的所有属性到与之关联的数据库记录,然后返回一个与当前Session关联的新持久化对象。 5. **脱管到瞬时:** 这个转换不需要...
- **更新(Update)**:使用`Session.update()`或`Session.merge()`方法更新对象状态。例如: ```java Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); entity.set...
- 修改:`Session.update()`或`Session.merge()`用于更新数据。 - 查询:`Session.get()`, `Session.load()`, `Session.createQuery()`, `Session.createSQLQuery()`等方法用于获取数据。 6. **事务处理** - ...
- 更新:`session.update()`或`session.merge()`方法。 - 删除:`session.delete()`方法。 5. 提交事务:`session.getTransaction().commit()`提交事务,确保数据持久化。 6. 关闭资源:记得关闭Session和...
而游离态的对象,如果希望重新与Session关联,可以使用`Session.merge()`。 6. **CRUD操作**: - **创建(Create)**:`Session.save()`或`Session.persist()`方法用于将对象保存到数据库,生成新的主键。 - **...
- **merge()**:将游离或自由状态的对象合并到当前Session,创建一个新的持久化实例。 - **replicate()**:复制对象到数据库,可以用于复制现有记录或创建新记录。 - **persist()**:与save()类似,但不适用于已...
然后,可以使用Session的`save()`或`saveOrUpdate()`方法将新对象持久化到数据库。例如: ```java SessionFactory sessionFactory = ...; // 获取SessionFactory Session session = sessionFactory.openSession(); ...
调用`Session.update()`或`Session.merge()`方法更新对象状态,Hibernate会在事务提交时自动执行UPDATE语句。 #### - 删除(Delete) 使用`Session.delete()`方法移除对象,对应的数据库记录会被DELETE。 ### 6. ...
2. **更新(Update)**:当对象的状态发生改变,调用`Session.update()`或`Session.merge()`方法,Hibernate会检测变化并更新数据库记录。 3. **删除(Delete)**:调用`Session.delete()`方法,Hibernate会从...
此外,`Session`的`flush()`方法用于将内存中的改变同步到数据库,而`clear()`则可以清除当前Session中的对象。事务管理在Hibernate中非常重要,通常使用`Transaction`对象来包裹一组操作,确保其原子性。 对于更...
示例 4a - 使用session.merge(..)更新非 Hibernate 托管实体。 示例 5 - 删除会话中已存在具有相同标识符的实体的非 Hibernate 受管实体。 示例 5a - 在删除非 Hibernate 受管实体之前首先使用session.merge(..) 。...
游离状态的对象可以通过`merge`或`update`方法重新与Session关联,以同步其状态。 了解这些概念和方法的区别对于高效地使用Hibernate进行数据库操作至关重要,可以根据具体场景选择合适的方法来优化应用程序的性能...
### Hibernate merge、update与saveOrUpdate方法的区别 在Hibernate框架中,`merge`、`update`与`saveOrUpdate`这三个方法都是用于更新或保存实体对象到数据库中的,但它们之间存在着重要的区别,这些区别主要体现...
在Hibernate框架中,`merge()`是一个非常重要的方法,用于将一个对象的状态合并到当前的Session中。当调用`merge()`方法时,Hibernate会检查传入的对象是否已经在当前Session中存在。如果不存在,它将作为一个新对象...
1. **保存新对象**:如果传入的对象是未保存的新对象(unsaved),`merge` 方法会创建该对象的一个拷贝,并调用 `save` 方法将其保存到数据库,然后返回拷贝后的对象。 2. **同步状态**:如果对象是已分离的...
当在一个已开始的事务中调用此方法时,它会返回当前线程中已经存在的Session,如果不存在,则创建一个新的Session并将其绑定到线程。这种方式有助于减少不必要的Session创建,提高性能,并且自动管理事务的边界。 2...
- 更新:修改对象状态后,调用`Session.update()`或`Session.merge()`方法更新数据库记录。 - 删除:调用`Session.delete()`方法删除数据库中的记录。 - 查询:通过`Session.get()`获取单个对象,`Session.load()...