Hibernate中Session的saveOrUpdate方法是用来判断被操作对象究竟是一个持久化对象(persistent)还是自由状态(transient)对象,然后根据判断结果执行save或者update。
判断时参考对象映射文件的主键id中定义unsaved-value属性,如果不定义,则默认为unsaved-value=null。
unsaved-value有下列几个选项:
1.null:主键属性是对象类型,Hibernate直接判断操作对象的主键属性是否为null,如果是null则对象为自由状态,调用save方法,生成insert语句,在数据库增加一条记录,如果不为null,则对象为持久化状态,直接调用update方法,生成update的SQL语句,这里需要注意,如果数据库中不存在对应主键的记录则会抛出异常。
2.none:不论主键属性为任何值,都不能为none,因此Hibernate总是执行update。
3.any:不论主键属性为任何值,都肯定为any,因此Hibernate总是执行save,Hibernate生成主键。
一般情况下,尽量不要使用setId的方法来修改对象的主键值,因为如果缓存中已经存在了一个同样Id的对象,就无法执行save,update等持久化方法,执行时可能产生异常。
使用Hibernate的id generator来生成无业务意义的主键,推荐使用uuid生成方式,不建议使用assigned。
分享到:
相关推荐
### Hibernate merge、update与saveOrUpdate方法的区别 在Hibernate框架中,`merge`、`update`与`saveOrUpdate`这三个方法都是用于更新或保存实体对象到数据库中的,但它们之间存在着重要的区别,这些区别主要体现...
在Java的持久化框架Hibernate中,实体对象的状态管理和`saveOrUpdate`方法是核心概念,对于理解和有效使用Hibernate至关重要。在本教程中,我们将深入探讨实体对象的三种状态以及`saveOrUpdate`方法的工作原理。 ...
`saveOrUpdate`是Hibernate提供的一种便捷方法,用于处理对象的保存或更新操作。在深入讲解`saveOrUpdate`之前,我们先理解一下Hibernate的基本概念。 在Hibernate中,实体类(Entity Class)代表数据库中的表,...
让我们详细了解一下`HibernateSessionFactory`类中的关键方法和其背后的原理。 1. **配置和初始化SessionFactory** `HibernateSessionFactory`类通过`cfg.configure(CONFIG_FILE_LOCATION)`来读取配置文件(默认为...
本文将详细介绍Hibernate持久层中的一些核心方法,包括`session.load`, `session.find`, `session.iterator`, `session.save`, `session.update`, `session.saveorupdate`。 1. `session.load()`: - `load()`方法...
总的来说,HibernateTemplate提供了一组强大的方法来简化Hibernate的日常操作,涵盖了从简单的数据存取到复杂的数据库操作,极大地提升了开发效率。在实际应用中,根据数据量、性能需求以及业务逻辑,选择合适的方法...
1. 增加(Insert):在Hibernate中,我们可以通过Session的`save()`或`saveOrUpdate()`方法来保存新对象到数据库。在Spring整合中,通常会在Service层调用DAO层的方法,如`userRepository.save(user)`。 2. 删除...
### Hibernate中的`save()`与`saveOrUpdate()`方法详解 #### 一、概述 在Java持久化框架Hibernate中,`save()`与`saveOrUpdate()`是非常重要的两个方法,它们用于处理对象的持久化操作。理解这两个方法的工作原理...
- **查询操作**:使用Session的`createQuery()`方法来执行HQL(Hibernate Query Language)查询,或者通过`get()`方法来根据ID查询单个对象。 一个典型的插入和更新操作示例是: ```java // 获取Session实例 ...
本文将详细介绍 Hibernate 中常用的几种方法,包括 `save`, `update`, `saveOrUpdate`, `merge` 等,帮助开发者更深入地理解 Hibernate 的工作原理及其使用方式。 #### 二、Hibernate 对象状态管理 在 Hibernate ...
1. 插入数据:调用Session的save()或saveOrUpdate()方法,Hibernate会自动为无ID的对象生成ID,并将其保存到数据库。 2. 更新数据:使用update()或saveOrUpdate()方法更新已存在的实体状态。 3. 删除数据:调用...
脱管状态的对象可以通过调用`save()`、`persist()`或者`saveOrUpdate()`方法重新变为持久化状态。 #### 二、save 和 update 区别 - **save** 方法主要用于将一个瞬态对象保存到数据库中。当调用此方法时,...
* 使用 session.refresh(object),当 object 不是数据库中已有数据的对象的时候,不能使用 session.refresh(object) 因为该方法是从 Hibernate 的 session 中去重新取 object,如果 session 中没有这个对象,则会...
这涉及到使用Session的save()、saveOrUpdate()、load()、get()、update()、merge()和delete()方法。同时,还会讨论事务管理和并发控制,确保数据的一致性和完整性。 查询语言在Hibernate中主要有两种:HQL...
- 创建(Create):使用`Session.save()`或`Session.persist()`方法将对象持久化到数据库。 - 读取(Read):`Session.get()`或`Session.load()`用于根据主键获取对象,而`Query`或`Criteria`接口则支持更复杂的...
以下是 Hibernate 中对象的三种状态以及相关的保存方法: 1. **瞬时对象(Transient Objects)** - 当使用 `new` 关键字创建一个对象时,它处于瞬时状态。这种状态的对象与数据库中的任何记录没有关联,只存在于...
以上内容涵盖了`HibernateTemplate`的主要方法以及Hibernate中的SQL查询技术,这些技术可以帮助开发者更高效地进行数据库操作,同时也能更好地理解Hibernate的工作原理。对于实际开发来说,合理选择合适的方法对于...
例如,使用 `save()` 或 `saveOrUpdate()` 方法保存对象,`get()` 或 `load()` 方法获取对象,`update()` 更新对象,以及 `delete()` 删除对象。同时,Session 提供了事务管理能力,可以确保数据操作的原子性和一致...
- 使用`saveOrUpdate`方法代替单独的`save`和`update`,以简化对象状态的管理。 - 考虑使用Spring框架的@Transactional注解或其他事务管理工具,以简化事务处理逻辑。 总的来说,理解Hibernate的事务处理机制和`...