| 問題 | 答案 |
|---|---|
| 什麼是 Hibernate? | 開源 ORM 框架,輕量級封裝 JDBC,提供對象持久化、查詢、快取、事務管理 |
| 官網/下載/文檔 | hibernate.org / SourceForge / 官方參考文檔 |
| 作者 | Gavin King |
| 當前穩定版 (文檔寫作時) | 2.0.3 (現已演進至 6.x,Jakarta EE 9+ 命名空間 org.hibernate) |
| 中文論壇 | forum.hibernate.org.cn |
學習 Hibernate 不是學配置、不是學工具生成 hbm,而是學「對象持久層設計模式與最佳實踐」。
| 架構 | 結構 | 特點 |
|---|---|---|
| 傳統 EJB | Session Bean → Entity Bean → DB | 記憶體高、效能差、開發簡單(小專案) |
| JDBC+DAO | Session Bean → DAO → JDBC → DB | 記憶體低、效能高(手寫優化)、開發效率低 |
| Hibernate | Session Bean → DAO → Hibernate → DB | 記憶體中、效能最佳(自動優化)、開發效率高(複雜映射) |
結論:Hibernate 替代目標是 JDBC,非 Entity Bean。它是 DAO 實現層的高效引擎。
.hbm.xml 或註解 (@Entity, @Table, @Id, @OneToMany...)@Version)、悲觀鎖 (LockMode)| 陷阱 | 症狀 | 對策 |
|---|---|---|
| N+1 查詢 | 遍歷集合觸發大量 SQL | fetch="join", HQL LEFT JOIN FETCH, @BatchSize |
| 遊離對象更新失敗 | NonUniqueObjectException | session.merge() 而非 update() |
| 懶加載異常 | LazyInitializationException | Open Session In View 模式、DTO 投影、fetch="join" |
| 樂觀鎖失效 | 版本號未遞增 | 確認 @Version 欄位、資料庫欄位非空 |
| 二級快取髒讀 | 集群環境資料不一致 | 使用分散式快取 (Infinispan, Redis)、設定快取策略 |
hibernate.jdbc.batch_size=20、hibernate.order_inserts=trueselect/join/subselect/batch@Immutable 或 mutable="false" 開啟快取hibernate.cache.use_query_cache=true + query.setCacheable(true)hibernate.generate_statistics=true + JMX/Actuator 觀察javax.persistence/jakarta.persistence 為主JpaRepository 消除樣板代碼、Specification 動態查詢User.findByName() 靜態方法Hibernate 不只是 ORM 工具,更是對象持久層設計百科全書。掌握其核心在於理解對象-關係阻抗失配的各種解法與權衡。配置可查文檔、工具可生成,但設計判斷力——何時用樂觀鎖、如何切分繼承策略、快取粒度如何選——才是架構師的核心競爭力。正如作者所言:「萬變不離其宗,完整掌握 Hibernate,再學 OJB 不超過一週」。