在真正的物件導向分析與設計(OOAD)中,我們首先進行 UML 建模,最終以類別圖呈現系統所有物件的完整設計。通常會得到控制業務邏輯的類別、保存業務資料的模組類別(Bean 類別)以及輔助類別。將業務所需資料歸納為單一模組類別,更有利於分層架構。然而,當深入資料庫底層實作時,為了存取資料,不得不加入操作資料庫的控制邏輯,這會破壞原本完美的設計,因為業務資料層在 UML 中只是單純的資料模組,底層實作卻變得異常複雜。Hibernate 正是解決了這個問題,它處理了業務資料層複雜的底層實作細節,開發者只需專注於代表資料的領域物件(POJO)即可。
帶著問題研究遠比單純好奇更有深度。關聯式資料庫是資料儲存的最佳選擇,但隨著 OO 技術發展,關聯式資料庫的設計體系與 OO 體系在持久層上嚴重不合。當滿腦子 OOAD 的開發者面對滿天飛的 SQL 語句時,那種痛苦不言而喻。無論業務層設計多完美,在真正儲存或載入資料時,面對的只是一堆封裝好的資料,這些資料在 JDBC 中已完全失去「業務物件」的語義,整體 OOAD 到此終結。
核心在於將類別映射至資料表(class → table),物件實例對應資料列。以簡單 JavaBean 為例:
public class SimpleBean {
protected int id;
protected String name;
public int getId() { return id; }
public void setId(int id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
}
映射規則直觀:className → tableName,propertyName → columnName,一個類別實例即資料表的一行。
進一步考慮雙向一對一關聯:
public class Class1 {
public Class2 class2;
public Class2 getClass2() { ... }
public void setClass2(Class2 class2) { ... }
}
public class Class2 {
public Class1 class1;
public Class1 getClass1() { ... }
...
}
在資料表中,table1 和 table2 需互相增加一列保存對方的 Key,以實現雙向導航。Hibernate 透過精密的映射機制(XML 或註解),自動處理這類關聯轉換,讓開發者以純物件方式操作資料,完全屏蔽 SQL 細節。