当前位置: 首页 > news >正文

Hibernate中save与saveOrUpdate的差异解析

在Hibernate中,save()saveOrUpdate()都是用于持久化对象的方法,但它们的适用场景和行为有显著差异:


1. save()方法

  • 核心行为

    • 仅适用于瞬时态(Transient)对象(即新创建、未与Session关联的对象)。
    • 会立即为对象分配一个标识符(ID),并计划在事务提交时执行INSERT操作。
    • 若尝试对已持久化(Persistent)或游离态(Detached)对象调用save(),会抛出异常。
  • 返回值
    返回生成的Serializable类型的主键ID。

  • 典型场景

    User user = new User(); // 瞬时态对象
    Serializable id = session.save(user); // 执行INSERT,返回ID
    

2. saveOrUpdate()方法

  • 核心行为

    • 智能判断对象状态
      • 若对象为瞬时态:执行INSERT操作(类似save())。
      • 若对象为游离态:执行UPDATE操作(更新数据库记录)。
      • 若对象已为持久态:忽略操作(无需重复保存)。
    • 不会返回主键ID(无返回值,void)。
  • 典型场景

    User user1 = new User(); // 瞬时态
    session.saveOrUpdate(user1); // 执行INSERTUser user2 = session.get(User.class, 1L); // 持久态
    session.evict(user2); // 转为游离态
    user2.setName("NewName");
    session.saveOrUpdate(user2); // 执行UPDATE
    

3. 关键区别总结

特性save()saveOrUpdate()
适用对象状态仅瞬时态瞬时态、游离态
返回值返回主键ID无返回值(void)
重复调用对同一对象重复调用会引发异常对同一对象可安全重复调用
数据库操作总是INSERT可能INSERT或UPDATE

4. 如何选择?

  • 使用save()
    明确需要插入新记录且无需处理游离态对象时(如严格的新增操作)。

  • 使用saveOrUpdate()
    不确定对象状态(如从表单接收的数据可能对应新增或修改),或需要统一处理插入/更新逻辑时。

⚠️ 注意

  • 对游离态对象调用save()会抛出TransientObjectException
  • saveOrUpdate()可能因版本冲突(如乐观锁)抛出StaleObjectStateException
http://www.lqws.cn/news/601345.html

相关文章:

  • HDMI2.1 FRL流控 概览
  • Linux驱动学习day13(同步与互斥)
  • AI的未来:人类会被取代,还是变得更强大?
  • HTTPS安全传输时采用的顶级阳谋
  • 【Maven 】 <resources> 配置中排除 fonts/** 目录无效,可能是由于以下原因及解决方案:
  • 编写rosbag脚本记录雷达与imu数据包
  • 学习经验分享【41】YOLOv13:基于超图增强自适应视觉感知的实时目标检测
  • day41简单CNN
  • 【Web3.0】Web1.0、Web2.0和Web3.0有哪些区别联系?
  • MySQL 8.4 备份与恢复完全指南
  • win11,visual studio 2022,配置dcmtk,opencv
  • 【记录】Word|Word创建自动编号的多级列表标题样式
  • 结构体实战:用Rust编写矩形面积计算器
  • Linux安装JDK和Maven
  • vue中scss下载方式与引入方式
  • 【深度学习1】ModernBert学习
  • 【IP 潮玩行业深度研究与学习】
  • SpringCloud系列(45)--SpringCloud Bus简介
  • 基于Spring Cloud微服务架构的API网关方案对比分析
  • 快应用(QuickApp)技术解析与UniApp跨端开发生态探秘优雅草卓伊凡
  • 振荡电路Multisim电路仿真实验汇总——硬件工程师笔记
  • 在CPU设计中,为什么要引入指令集架构?有什么好处?-- 数字IC笔试
  • 强化学习:Policy Gradients 学习笔记
  • 1.MySQL之如何定位慢查询
  • AI赋能智慧餐饮:Spring Boot+大模型实战指南
  • js严格模式和非严格模式
  • 从docker-compose快速入门Docker
  • JVM 中的垃圾回收算法及垃圾回收器详解
  • JavaWeb笔记02
  • 渗透测试(Penetration Testing)入门:如何发现服务器漏洞