在真正的物件導向分析設計 (OOAD) 中,系統設計產出的是完整的 UML 類別圖,業務資料被封裝在領域物件。然而傳統 JDBC 迫使開發者在持久層撰寫大量 SQL,導致物件模型在資料庫層面解體。Hibernate 正是為了解決這個「物件-關聯阻抗不匹配」問題而生。
| 物件模型 | 關聯式資料庫模型 |
|---|---|
| 以物件看待世界 | 以有效儲存資料為唯一出發點 |
| 關係:繼承、關聯、聚合、組合 | 關係:Primary Key / Foreign Key 之間的參考 |
| 豐富的語意表達 | 扁平化的資料表結構 |
Hibernate 的核心任務,就是透過映射機制,將物件圖 (Object Graph) 正確持久化為資料列,並在載入時重建物件圖。
class → table
property → column
instance → row
<one-to-many> / <many-to-one>。Java 集合 (List, Set, Map, Array) 在資料庫中如何表達?
Set<String>):建立獨立資料表,含外鍵與值欄位 (<element>)。Set<Order>):轉換為一對多關聯。Map:需指定索引欄位 (<key>、<index>)。| 策略 | 說明 | 優/缺點 |
|---|---|---|
| Table per Class Hierarchy | 單一資料表含所有子類別欄位,加判別欄位 | 查詢快,但子類別欄位需允許 NULL |
| Table per Subclass | 父類一表,各子類一表,主鍵共用 | 正規化好,查詢需 JOIN |
| Table per Concrete Class | 每個具體類別一表,含繼承欄位 | 無 JOIN,但多型查詢需 UNION,主鍵難共享 |
Hibernate 管理物件三種狀態:
update()/merge())。透過 Session 的 save(), update(), saveOrUpdate(), merge(), lock() 等方法控制狀態流轉,確保記憶體物件圖與資料庫一致。
Hibernate 不只是 ORM 工具,更是一套完整的持久化框架,處理了從映射定義、查詢語言 (HQL/Criteria)、快取策略、交易管理到物件生命週期的完整課題。深入理解其運作原理,才能在複雜企業應用中發揮最大效益。