Hibernate 作為 Java 持久層事實標準,其面試考點極高。本文系統整理 15 道高頻選擇題、核心概念深度解析、實戰優化策略,幫助你從「會用」進階到「懂原理、能優化」。
| # | 題目要點 | 答案 | 核心考點 |
|---|---|---|---|
| 1 | 關係/對象映射關係 | A,B,C | ORM 基礎映射規則 |
| 2 | SessionFactory 特性 | B,C | 重量級、線程安全、一對一數據源 |
| 3 | Set 集合映射元素 | A (<set>) | 集合映射標籤 |
| 4 | cascade 級聯保存值 | D (save-update) | 級聯操作傳播 |
| 5 | Session 核心方法 | A,B,C,D,F | API 熟悉度 |
| 6 | 同一 Session 重複 load | C (true) | 一級緩存保證同一性 |
| 7 | 同一事務雙次修改 | B (1 條 SQL) | 脏檢查合併更新 |
| 8 | 對象三大狀態 | A,C,D | 瞬時/持久/游離 |
| 9 | 對象變持久化行號 | D (save()) | 狀態轉換觸發點 |
| 10 | 對象變游離行號 | F (close()) | Session 關閉觸發 |
| 11 | 外連結檢索策略 | C (迫切左外連接) | 關聯獲取策略 |
| 12 | 延遲加載異常場景 | C (運行時異常) | Session 關閉後訪問代理 |
| 13 | HQL vs SQL | B,D | 面向對象查詢語言特性 |
| 14 | 事務隔離實現者 | C (數據庫系統) | ACID 基礎 |
| 15 | 並發性能優鎖 | B (樂觀鎖) | 鎖機制選型 |
new Entity() → [Transient 瞬時態]
│
├─ session.save() → [Persistent 持久態] ← session.load/get()
│ │ │
│ ├─ session.delete() → Transient
│ │
│ ├─ session.close/clear/evict() → [Detached 游離態]
│ │
│ └─ 事務提交/flush → DB 同步
│
└─ session.update/saveOrUpdate() → Persistent (從 Detached)
session.lock() → Persistent (無修改)
| 維度 | get() | load() |
|---|---|---|
| 未命中行為 | 返回 null | 拋 ObjectNotFoundException |
| 返回類型 | 實體對象 | 代理對象(支援延遲加載) |
| 緩存策略 | 僅查一級緩存 | 一級→二級→DB |
| 適用場景 | 不確定存在性 | 確定存在、需延遲加載 |
c1 == c2(題 6 答案)read-only > nonstrict-read-write > read-write > transactional(隔離級別遞減,並發性能遞增)針對 HQL/SQL 條件查詢,Key = 查詢語句 + 參數 + 分頁信息,依賴二級緩存,表數據變更自動失效相關 Query Key。
| 策略 | 適用場景 | 優缺點 |
|---|---|---|
| identity | MySQL/SQL Server/DB2 自增列 | 依賴 DB、批量插入效能低 |
| sequence | Oracle/PostgreSQL Sequence | 高併發友好、需額外 DB 對象 |
| native | 跨 DB 移植項目 | 自動選擇 identity/sequence/hilo |
| uuid.hex | 分庫分表、高併發寫入 | 無鎖、長度 32、索引較大 |
| assigned | 業務主鍵(如身份證號) | 需業務保證唯一、不推薦 |
inverse="true" 放在「多」方,由關係維護端控制外鍵,減少 UPDATE 語句<bag>(允許重複、無序、效能最好),多對多用 <set>(唯一性語義)<class-cache> 而非 <collection-cache>lazy="true"(默認),但需警惕 N+1 問題,關鍵路徑用 fetch="join" 或 HQL join fetchsession.createQuery("delete User where ...").executeUpdate() 避免加載對象hibernate.generate_statistics=true 監控緩存命中率、SQL 執行耗時update()(已修改)、saveOrUpdate()(自動判斷)、lock()(未修改,僅重新關聯)join fetch 3) 初始化後再關閉 Session 4) DTO 投影查詢掌握 Hibernate 面試核心,關鍵在於理解 狀態機、緩存分級、脏檢查、延遲加載 四大支柱機制。實戰中,優化順序建議:SQL 調優 > 緩存策略 > 映射優化 > 批量操作。將原理內化為代碼直覺,才能在高併發、大數據場景下駕輕就熟。