1.save()导致的最终结果是执行insert语句,先看下面的代码:
- Session session2=HibernateUtil.getSession(); Customer c2=(Customer)session2.load(Customer.class, new Long(5));
- HibernateUtil.closeSession(session2);
- c2.setName("ghsea5");
- session.save(c2);
- tx.commit();
这里查询出的是ID为5的一个对象,执行
session.save(c2)后数据库里会插入一条ID为6的数据,如果只是想修改这个ID为5的对象的name属性,而不是新插入一条数据,可以执行session.flush(),使session与数据库同步。不要错误地用save()去同步session缓存和数据库。它只是用来保存一个记录的,是用来“Persist the given transient instance, first assigning a generated identifier”。
update和saveOrUpdate是用来对跨Session(即脱 管的)的PO进行状态管理的。
2.“update的作用就在于此,它只会被用于当一个PO对象跨Session进行状态同步的时候才需要写。而一个PO对象当它不需要跨Session进行状态管理的时候,是不需要写update的。”
- tx=session.beginTransaction();
- Session session2=HibernateUtil.getSession();
- Customer c2=(Customer)session2.load(Customer.class, new Long(5));
- HibernateUtil.closeSession(session2);
- c2.setName("ghsea5");
- session.update(c2);
- tx.commit();
执行第4行后,c2变成脱管对象,第6行,用session对以c2进行更新,这里c2是跨Session的。
3.saveOrUpdate和update的区别就在于在跨Session的PO状态管理中,Hibernate对PO采取何种策略。
- public void addMate(Grade cat, Student mate) {
- Session session = ...;
- Transacton tx = ...;
- session.saveOrUpdate(cat);
- cat.addMate(mate);
- tx.commit();
- session.close();
- };
上面这些代码用到
saveOrUpdate是合理的,如果用save()不一定合适,试想一下,如果只是想给一个存在的Grade(班级)添加一个Srudent,用save()导致的结果将是向数据库中插入一条新的记录,即一个新的班级,而saveOrUpdate的策略是,如果该对象的ID已经存在,则执行update(),如果该对象的ID不存在,则用save()策略。
Hibernate此时究竟采取更新cat对象,还是save cat对象,取决于unsave-value的设定。如下面这样设定unsave-value:
分享到:
相关推荐
在Java的持久化框架Hibernate中,管理对象与数据库之间的交互是通过一系列的方法完成的,其中包括`save()`, `saveOrUpdate()`, `persist()`, `merge()`, 和 `update()`。这些方法各有其特点和适用场景,理解它们的...
`saveOrUpdate` 方法结合了`save`和`update`的功能,它可以智能地判断对象是应该被插入还是更新。如果对象的标识符在数据库中不存在,则执行插入操作;如果存在,则执行更新操作。具体而言: - **新对象**:如果...
5. **节省代码**:使用`saveOrUpdate`可以减少代码量,因为无需先判断对象是否已存在,再分别调用`save`或`update`方法。 6. **潜在问题**:虽然`saveOrUpdate`方便,但有时可能导致意料之外的行为,比如在不知道...
### Hibernate中的`save()`与`saveOrUpdate()`方法详解 #### 一、概述 在Java持久化框架Hibernate中,`save()`与`saveOrUpdate()`是非常重要的两个方法,它们用于处理对象的持久化操作。理解这两个方法的工作原理...
使用 Hibernate 可以使用 saveOrUpdate 方法,但是使用原生 SQL 语句时,该如何实现 save 操作呢?今天,我们将讨论 MySQL 中 save 的写法汇总。 使用 IGNORE 关键字实现数据不存在则插入,存在则无操作 在 MySQL ...
`saveOrUpdate`是Hibernate提供的一个便捷方法,它的主要作用是根据对象当前的状态来决定执行`save()`还是`update()`操作。具体来说: - 如果对象是瞬时状态,`saveOrUpdate`会调用`save()`,为对象生成一个新的...
### Save和SaveOrUpdate方法的区别 - **Save方法**:用于保存瞬时对象。如果尝试对已存在ID的对象使用此方法,不会更新现有记录,而是新增一条记录。 - **SaveOrUpdate方法**:更灵活,能根据对象状态决定是否插入...
Hibernate 难点解析: hibernate中uuid和native的相关总结 Hibernate get与load的区别 hibernate二级缓存中list和iterator的用法 ...lock和update区别 save 和update区别 update 和saveOrUpdate区别
脱管状态的对象可以通过调用`save()`、`persist()`或者`saveOrUpdate()`方法重新变为持久化状态。 #### 二、save 和 update 区别 - **save** 方法主要用于将一个瞬态对象保存到数据库中。当调用此方法时,...
Hibernate提供了多种保存方式,包括save()、persist()、update()、saveOrUpdate()等,了解这些方法的区别非常重要,以便正确使用它们。本文将对Hibernate的各种保存方式进行详细的比较和分析。 一、预备知识 在...
本文将详细介绍 Hibernate 中常用的几种方法,包括 `save`, `update`, `saveOrUpdate`, `merge` 等,帮助开发者更深入地理解 Hibernate 的工作原理及其使用方式。 #### 二、Hibernate 对象状态管理 在 Hibernate ...
本文将详细介绍Hibernate持久层中的一些核心方法,包括`session.load`, `session.find`, `session.iterator`, `session.save`, `session.update`, `session.saveorupdate`。 1. `session.load()`: - `load()`方法...
- **Insert**: 使用Session的Save或SaveOrUpdate方法插入新对象到数据库。 - **Update**: 当对象状态改变时,调用Session的Update方法同步数据库。 - **Delete**: 调用Session的Delete方法移除对象。 - **Query**: ...
- saveOrUpdate():这是一个合并save()和update()功能的方法。如果对象是新的,它将执行INSERT,如果对象已经存在于数据库中,它将执行UPDATE。 - merge():此方法将游离对象的状态合并到持久化对象中,如果对象...
- **saveOrUpdate()**:根据对象是否存在持久化标识来决定执行save()或update(),适用于不确定对象状态的情况。 - **merge()**:将脱管对象的状态合并到当前Session的持久化副本中,然后更新数据库。如果对象不...
其次,持久状态(Persistent)意味着对象已经通过Session的save()、saveOrUpdate()等方法保存到数据库,并且仍然在Hibernate的缓存管理中。在这种状态下,对象的任何改动在事务提交时会被自动同步到数据库。例如,...
`save()`、`update()`、`saveOrUpdate()`、`persist()`和`merge()`是Hibernate中用于处理对象状态变化的主要方法。 - **save()**:保存一个新的瞬态对象到数据库,生成并返回主键标识符。如果对象已存在,可能会...