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

Hibernate 面試題精選匯總:從查詢優化到主鍵生成策略

     編輯:Java 相關知識

整理高頻 Hibernate 面試題,涵蓋查詢優化、多表查詢映射、load/get 差異、緩存機制、主鍵生成 10 大策略,附實戰建議。

1. 查詢慢如何優化?

  1. 建立索引
  2. 減少表關聯
  3. 優化 SQL:避免全表掃描、走索引、大表前置
  4. 精簡查詢欄位:select 僅需欄位,限制回傳行數

2. 多表查詢無對應實體怎麼映射?

方案一:Object[] 接收 → 手動組裝 DTO

方案二:DTO 類別提供對應建構子,HQL 直接 new DTO(f1, f2) 實例化

3. session.load() vs session.get() 深度對比

Session 載入完整流程

  1. 一級緩存(Session 級)查找
  2. NonExists 記錄查找(查詢黑名單,避免重複無效查詢)
  3. load() 才:二級緩存(SessionFactory 級)查找
  4. 發送 SELECT SQL
  5. 無記錄 → 寫入 NonExists,回傳 null
  6. 有記錄 → 建構實體物件
  7. 納入一級緩存
  8. 執行 Interceptor.onLoad()
  9. 納入二級緩存
  10. 實作 LifeCycle → 呼叫 onLoad()
  11. 回傳實體

4. Hibernate 主鍵生成 10 大策略

維度get()load()
無記錄時回傳 null拋出 ObjectNotFoundException
回傳型別實體類別實例**Proxy 代理物件**(延遲載入)
緩存查找順序一級緩存 → **直接查 DB**一級緩存 → **二級緩存** → DB
效能較慢(繞過二級緩存)較快(利用二級緩存)
策略機制適用場景/備註
assigned外部指定業務主鍵、自然鍵
hilohi/lo 演算法 + 額外表跨資料庫可移植
seqhilohi/lo + SequenceOracle 等支援 Sequence 的 DB
increment記憶體計數器遞增**單進程單實例**,多實例會主鍵衝突
identityDB 自增欄位MySQL/SQL Server/DB2
sequenceDB SequenceOracle/PostgreSQL
nativeHibernate 自動選 identity/sequence/hilo**跨資料庫首選**,不確定 DB 時用此
uuid.hex128-bit UUID → 32 字元十六進制**高併發寫入最佳**,無鎖、跨庫、效能強
uuid.string16 字元 UUID(未編碼)某些 DB(如 PostgreSQL)可能有問題
foreign外部表欄位作主鍵一對一關聯共享主鍵

選型實戰建議

  • **單實例、MySQL/SQL Server** → identity 或 native
  • **Oracle** → sequence 或 native
  • **高併發、分布式、跨庫遷移** → uuid.hex(效能最強、無鎖競爭)
  • **多 Hibernate 實例共用表** → **禁用 increment**,改 identity/native
  • DB 自增機制隱憂:內部表鎖導致大量併發 INSERT 互鎖,效能瓶頸

面試加分點

  • 能說清 load() Proxy 機制與 NonExists 黑名單優化
  • 知道 uuid.hex 解決分布式主鍵衝突與鎖競爭
  • 理解 increment 僅限單實例,生產環境慎用
  • 會根據 DB 特性選擇 native 實現可移植性

掌握核心機制與選型邏輯,面試與架構決策皆從容應對。

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