首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Hibernate 核心:Java 對象三大狀態(瞬時/持久/游離)與轉換圖解

     編輯:Java 綜合教學

Hibernate 核心:Java 對象三大狀態(瞬時/持久/游離)與轉換圖解

Hibernate 根據對象與 Session 關聯程度,將對象劃分為三種狀態,理解狀態轉換是掌握 ORM 操作的關鍵。

三大狀態詳解

狀態特徵典型場景
瞬時態 new 創建,無 ID,無 Session 管理,無數據庫記錄對應 new User() 剛創建
持久態 關聯 Session,有 ID(數據庫主鍵),Session 追蹤變更,事務提交自動同步 DB session.save(user)、session.get(User.class, id)
游離態 曾持久,現脫離 Session 管理,有 ID 但 Session 無法感知變更 session.close()、session.evict(obj) 後

狀態轉換路徑

瞬時態 ──save()/saveOrUpdate()──▶ 持久態
  ▲              │                        │
  │              │ delete()               │ evict()/clear()/close()
  │              ▼                        ▼
  └────── delete() ◀─────── 游離態 ◀── update()/saveOrUpdate()
  • 瞬時 → 持久:save()、saveOrUpdate()、get()、load()
  • 持久 → 瞬時:delete()(數據庫記錄刪除,對象變瞬時)
  • 持久 → 游離:evict(obj)(移除特定)、clear()(清空)、close()(關閉 Session)
  • 游離 → 持久:update()、saveOrUpdate()(重新關聯新 Session)
  • 游離 → 瞬時:delete()

get() vs load() 關鍵差異

特性get()load()
查無數據返回 null拋 ObjectNotFoundException
加載策略立即查詢,發 SQL延遲加載,返回代理對象,首次訪問非 ID 屬性才發 SQL
性能確定存在用 get確定存在、僅需 ID 關聯時用 load

原理:load() 利用 CGLIB 動態代理,代理對象僅含 ID,屬性訪問時觸發攔截器查詢數據庫。

最佳實踐

  1. 優先用 get(),業務邏輯需判空。
  2. 僅建立關聯關係(如設置外鍵)時用 load() 避免多餘查詢。
  3. 長會話模式下注意游離對象重新關聯時的版本衝突(樂觀鎖)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved