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

Hibernate get() 與 load() 區別深度解析

     編輯:Java 綜合教學

加載機制對比

特性session.get()session.load()
執行時機立即發送 SQL,查詢數據庫延遲加載,返回代理對象,僅含 ID
性能稍低(未用也查詢)較高(按需查詢)
對象不存在返回 null拋 ObjectNotFoundException(訪問非 ID 屬性時)
異常場景調用方法觸發 NPESession 關閉後訪問觸發 LazyInitializationException

代碼示例與現象

load() 延遲加載

User user = (User) session.load(User.class, 2); // 無 SQL
System.out.println(user.getId());               // 僅輸出 2,無 SQL
System.out.println(user.getUsername());         // 此時發送 SQL 查詢

get() 立即查詢

User user = (User) session.get(User.class, 2);  // 立即發送 SQL
// 若 ID 不存在,user 為 null,後續調用拋 NPE

常見異常與解決

  • ObjectNotFoundException:load() 代理對象訪問非 ID 屬性但數據庫無記錄。改用 get() 或捕獲異常。
  • LazyInitializationException:Session 已關閉才訪問代理屬性。解決:
    ① 改用 get()
    ② 在表現層開啟 Session(Open Session In View)。

選型建議

確定對象存在且即將使用 → get();僅需 ID 或不確定存在、追求性能 → load() 並注意 Session 生命週期。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved