Hibernate 作為 Java 領域經典的 ORM 框架,其核心架構圍繞 Configuration、SessionFactory、Session 三大接口展開。本文系統梳理這些核心組件的職責、協作關係,並深入剖析實體對象的三種狀態(瞬時態、持久態、游離態)及其轉換規則,為高效使用 Hibernate 奠定理論基礎。
.hbm.xml)或註解(@Entity、@Table 等)定義映射關係
職責:讀取 hibernate.cfg.xml、映射文件,構建 SessionFactory 的唯一數據源
SessionFactory 後即可丟棄configure()、addResource()、buildSessionFactory()Configuration cfg = new Configuration().configure(); // 默認讀取 hibernate.cfg.xml SessionFactory sf = cfg.buildSessionFactory();
定位:應用級單例,對應一個數據庫實例;多庫場景需創建多個 SessionFactory
| 特性 | openSession() |
getCurrentSession() |
|---|---|---|
| Session 實例 | 每次調用創建新實例 | 綁定當前線程,同一線程內重複調用返回同一實例 |
| 關閉方式 | 需手動調用 close() |
事務提交或回滾時自動關閉 |
| 適用場景 | 非托管環境、長會話、需精細控制生命週期 | Spring 托管環境、聲明式事務、Web 應用請求級會話 |
| 配置前提 | 無特殊要求 | 需在 hibernate.cfg.xml 配置 hibernate.current_session_context_class |
定位:輕量級、非線程安全、綁定事務邊界的工作單元
save()、update()、delete()、get()、load()、createQuery() 等核心 API
new() / 反序列化
│
▼
┌─────────────┐ save() / persist() ┌─────────────┐
│ 瞬時態 │ ─────────────────────────────▶ │ 持久態 │
│ (Transient) │ │ (Persistent)│
└─────────────┘ └─────────────┘
▲ │
│ │
│ close() / evict() │
│ clear() │
└─────────────────────────────────────────────┘
游離態
(Detached)
new Entity() 創建,無 ID,未關聯 Session,不在數據庫有記錄save()/persist() → 轉持久態delete() → 數據庫刪除 + 從緩存移除 → 變瞬時態close()、evict()、clear()、序列化脫離 Sessionupdate():強制更新,要求數據庫必須存在記錄saveOrUpdate():智能判斷(有 ID 且數據庫存在 → update;否則 → save)lock():不檢查數據庫,直接納入管理(需配合 LockMode)public void saveOrUpdate(Object entity) {
if (isTransient(entity)) {
save(entity); // 瞬時態 → 持久態
} else if (isDetached(entity)) {
update(entity); // 游離態 → 持久態
} else {
// 已是持久態,無操作
}
}
| 特性 | get() |
load() |
|---|---|---|
| 記錄不存在 | 返回 null |
拋出 ObjectNotFoundException |
| 返回類型 | 實體類實例 | 代理對象(延遲加載),lazy=false 時返回實體 |
| 緩存查找順序 | 一級緩存 → 數據庫(跳過二級緩存) | 一級緩存 → 二級緩存 → 數據庫 |
| 性能特點 | 立即查詢,確定存在用 get |
延遲加載,僅需 ID 關聯時用 load 避免多餘查詢 |
<class lazy="true">(默認)啟用延遲加載load() 返回 CGLIB/ByteBuddy 動態生成的代理類,僅包含 ID,其他屬性為 nullinstanceof 判斷為 true,但 getClass() 不同try-finally 或 Spring 托管)getCurrentSession():配合 Spring @Transactional 自動綁定生命週期get/load:確定存在用 get,僅需關聯用 load掌握核心接口協作與實體狀態機,是驾驭 Hibernate 進行高性能、穩健持久化開發的關鍵。後續將深入探討 HQL、Criteria、Transaction 等進階主題。