整理高頻 Hibernate 面試題,涵蓋查詢優化、多表查詢映射、load/get 差異、緩存機制、主鍵生成 10 大策略,附實戰建議。
select 僅需欄位,限制回傳行數方案一:Object[] 接收 → 手動組裝 DTO
方案二:DTO 類別提供對應建構子,HQL 直接 new DTO(f1, f2) 實例化
| 維度 | get() | load() |
|---|---|---|
| 無記錄時 | 回傳 null | 拋出 ObjectNotFoundException |
| 回傳型別 | 實體類別實例 | **Proxy 代理物件**(延遲載入) |
| 緩存查找順序 | 一級緩存 → **直接查 DB** | 一級緩存 → **二級緩存** → DB |
| 效能 | 較慢(繞過二級緩存) | 較快(利用二級緩存) |
| 策略 | 機制 | 適用場景/備註 |
|---|---|---|
| assigned | 外部指定 | 業務主鍵、自然鍵 |
| hilo | hi/lo 演算法 + 額外表 | 跨資料庫可移植 |
| seqhilo | hi/lo + Sequence | Oracle 等支援 Sequence 的 DB |
| increment | 記憶體計數器遞增 | **單進程單實例**,多實例會主鍵衝突 |
| identity | DB 自增欄位 | MySQL/SQL Server/DB2 |
| sequence | DB Sequence | Oracle/PostgreSQL |
| native | Hibernate 自動選 identity/sequence/hilo | **跨資料庫首選**,不確定 DB 時用此 |
| uuid.hex | 128-bit UUID → 32 字元十六進制 | **高併發寫入最佳**,無鎖、跨庫、效能強 |
| uuid.string | 16 字元 UUID(未編碼) | 某些 DB(如 PostgreSQL)可能有問題 |
| foreign | 外部表欄位作主鍵 | 一對一關聯共享主鍵 |
identity 或 nativesequence 或 nativeuuid.hex(效能最強、無鎖競爭)increment**,改 identity/nativeINSERT 互鎖,效能瓶頸load() Proxy 機制與 NonExists 黑名單優化uuid.hex 解決分布式主鍵衝突與鎖競爭increment 僅限單實例,生產環境慎用native 實現可移植性掌握核心機制與選型邏輯,面試與架構決策皆從容應對。