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.pswp.cn/bicheng/87106.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/87106.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/87106.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

香橙派3B學習筆記14:deb 打包程序_解包前后腳本運行

本文學習如何用deb打包的方式打包自己需要調用系統庫的程序。 然后實現deb解包前后的腳本運行。 目錄 承接上文: 刪除上文遺留的.so文件: 終止ledlight進程: 目標解釋: 創建項目結構: 創建control文件: 創…

nanoGPT復現——prepare拆解(自己構建詞表 VS tiktoken)

在nanoGPT的data文件夾有兩個很相似的文件夾結構:shakespeare和shakespeare-char,這兩種都是對shakespeare數據集的處理,但是shakespeare使用的是tiktoken對文字進行編碼,另一個則是使用自己構建的詞表 一、shakespeare-char&…

macos 安裝 xcode

在 macOS 上安裝 Xcode(或者 Xcode Command Line Tools)的方法如下: 1. 安裝 Xcode Command Line Tools(輕量級,滿足大部分編譯需求) 終端命令: xcode-select --install會彈出安裝提示&#x…

大學專業科普 | 云計算、大數據

大數據專業是近年來隨著信息技術發展而興起的熱門學科,專注于從海量、多樣化的數據中提取有價值信息,為各行業提供數據驅動的決策支持。 專業定義 大數據專業旨在培養掌握大數據采集、存儲、管理、分析和應用等核心技術的人才。該專業融合了計算機科學…

本地文件自動提交到倉庫

背景 將本地目錄做一個存儲倉庫,將歸檔的文件放入其中。自動同步到遠程倉庫。 倉庫配置 省略 配置密鑰 用戶可以 git pull \ git push \ git commit 自動 拉取、更新 腳本 文件名:autosave.sh #!/bin/zsh# 設置變量 LOCAL_DIR$1# 進入工作目錄 cd "…

Ubuntu中控制用戶存儲空間配置步驟

目的,限制用戶磁盤空間占用,例如給用戶限制100-150G容量 1.安裝磁盤配額工具 sudo apt-get install -y quota 2.備份并修改/etc/fstab文件,使能支持quota sudo cp /etc/fstab /etc/fstab.bak vim /etc/fstab #寫入如下,usrjquotaaquota.u…

【網絡】Linux 內核優化實戰 - net.ipv4.tcp_rmem 和 net.core.rmem_default 關系

net.ipv4.tcp_rmem 和 net.core.rmem_default 都是 Linux 內核中控制網絡接收緩沖區的參數,但它們的作用范圍、優先級和使用場景存在明顯區別。以下是詳細對比: 核心區別 參數net.ipv4.tcp_rmemnet.core.rmem_default作用協議僅針對 TCP 協議針對 所有網絡協議(TCP、UDP 等…

設計模式精講 Day 14:命令模式(Command Pattern)

【設計模式精講 Day 14】命令模式(Command Pattern) 文章內容 在“設計模式精講”系列的第14天,我們來學習命令模式(Command Pattern)。命令模式是一種行為型設計模式,它將請求封裝為對象,從而…

手機射頻功放測試學習(二)——手機線性功放的靜態電流和小信號(S-Parameter)測試

目錄 一、概要 二、LPA的電流測試 1、LPA的泄漏電流測試 手動測試步驟如下: 自動化測試: 2、LPA的靜態電流測試 手動測試步驟如下: 自動化測試: 三、LPA的S-Parameter測試 1、矢量網絡分析儀校準 2、LPA的S參數手動測試步驟: 3、LPA的S參數自動測試步驟: 四…

基礎算法合集-圖論

本文將介紹數據結構圖論部分中常見的算法 單源最短路徑問題(用來計算一個點到其他所有頂點的最短路徑) Dijkstra(n*n) 1. 初始化: 先找出從源點V0到各終點Vk的直達路徑(V0,Vk), 即通過一條弧到達的路徑 2. 選擇: 從這些路徑中找出一條長度最短的路徑(V0,u) 3. 更新: 然后對其余…

vue-i18n 插件打包解析失效問題記錄

vue-i18n 插件打包解析失效問題記錄 開發環境中沒有問題的,但打包發布之后就不行了,顯示的就是模板字符串 // An highlighted block const messages {en: {step: {stepDesc1: Scan,stepDesc2: Analyze,stepDesc3: Result}},zh: {step: {stepDesc1: 掃描…

數據可視化 - 單子圖

一、認識單子圖 import matplotlib.pyplot as plt import numpy as np import pandas as pdplt.figure(num單子圖, figsize(12, 8), facecolorw) # 中文字體 plt.rcParams[font.sans-serif] KaiTi # 負號顯示 plt.rcParams[axes.unicode_minus] False# 2行,1列&a…

服務器上設置了代理之后,服務器可以訪問外網,但是不能訪問服務器本地。如何解決

你在服務器上設置了代理后,發現: 可以訪問外網不能訪問服務器本地地址(如 localhost、127.0.0.1、內網IP) 這是代理設置中常見的問題,尤其是當你設置了全局 HTTP/HTTPS 代理時。本地訪問也會被強制走代理&#xff0c…

mysql啟動報錯:Can‘t connect to local MySQL server through socket

文章目錄 一、報錯內容二、解決方法 一、報錯內容 在linux上啟動mysql時報錯 [rootlocalhost bin]# ./mysql -u root -p Enter password: ERROR 2002 (HY000): Cant connect to local MySQL server through socket /tmp/mysql.sock (2)執行以上命令后報錯,并且也…

C# Avalonia 綁定模式 Mode 的區別,它們的應用場景

C# Avalonia 綁定模式 Mode 的區別,它們的應用場景 文章目錄 1. **Default(默認模式)**2. **OneTime(一次性綁定)**3. **OneWay(單向綁定)**4. **TwoWay(雙向綁定)**5. *…

【OpenGL學習】(七)紋理單元

【OpenGL學習】(七)紋理單元 OpenGL的紋理單元(Texture Unit)是GPU中用于管理和組織紋理資源的邏輯單元,它允許開發者在渲染過程中同時使用多個紋理,并通過采樣器(Sampler)在著色器…

Ubuntu 下降 Linux Kernel 的版本備忘

此處以 ubuntu 22.04 為示例系統,來降低其 Linux kernel 的版本。 1. 降低 Linux kernel 版本 在 Ubuntu 22.04 上降低 Linux 內核版本的步驟如下所示。 步驟 1:檢查當前內核版本 uname -r 確認當前運行的內核版本。 步驟 2:查看已安裝的…

Python 數據分析與機器學習入門 (八):用 Scikit-Learn 跑通第一個機器學習模型

引言:初識 Scikit-Learn Scikit-learn 是 Python 機器學習領域的黃金標準庫。它構建在 NumPy, SciPy 和 Matplotlib 之上,提供了大量用于分類、回歸、聚類和降維等任務的算法。Scikit-learn 廣受歡迎的原因在于其三大核心優勢: 一致的 API 設…

FPGA芯片的配置方法

FPGA芯片的配置方法 文章目錄 FPGA芯片的配置方法1. FPGA配置概述2. 主動配置模式3. 被動配置模式4. JTAG配置模式5. 總結 1. FPGA配置概述 當我們在PC機上的FPGA軟件集成開發環境中完成我們的設計后,必須通過某種形式將其映射到FPGA芯片硬件中,這樣FPG…

通過python+openCV實現對圖片中箭頭方向的判斷

在項目中遇到一個需求,需要對圖片中的箭頭方向進行判斷,本來是使用YOLOv8算法來實現的,但是發現YOLO的效果對箭頭的識別效果很差,不管是分類算法還是檢測算法,效果都不理想,因此試一試通過openCV對箭頭方向進行判斷,發現效果還可以。 下面附上完整的代碼和原理。 文章目…