Hibernate 是 Java 應用程式與關聯式資料庫之間的橋樑,負責將 Java 物件自動映射為關聯式資料,內部封裝了 JDBC 操作細節,向上層提供面向物件的資料存取 API。本文透過一個簡單的 helloapp 範例應用,完整示範從環境建置到 CRUD 操作的全流程,幫助讀者快速建立 Hibernate 開發的核心概念。

如圖所示,Hibernate 位於業務邏輯層與資料庫之間,屏蔽了底層 SQL 差異。helloapp 範例功能包含:透過 Hibernate 對 Customer 物件進行儲存、更新、刪除、載入與查詢。該應用既可作為獨立 Java 程式執行,也可部署為 Java Web 應用,原始碼位於配套光碟的 sourcecode/chapter2/helloapp 目錄。
hibernate.properties 或 hibernate.cfg.xml).hbm.xml)組態文件需放置於應用程式的 classpath 中,支援兩種格式:
hibernate.properties,採鍵值對格式hibernate.cfg.xml,結構化程度更高hibernate.dialect=net.sf.hibernate.dialect.MySQLDialect
hibernate.connection.driver_class=com.mysql.jdbc.Driver
hibernate.connection.url=jdbc:mysql://localhost:3306/SAMPLEDB
hibernate.connection.username=root
hibernate.connection.password=1234
hibernate.show_sql=true
| 屬性名稱 | 說明 |
|---|---|
| hibernate.dialect | 指定資料庫 SQL 方言,Hibernate 据此生成特定資料庫的 SQL |
| hibernate.connection.driver_class | JDBC 驅動程式完整類別名稱 |
| hibernate.connection.url | JDBC 連線字串 |
| hibernate.connection.username | 資料庫登入帳號 |
| hibernate.connection.password | 資料庫登入密碼 |
| hibernate.show_sql | true 時在主控台輸出執行的 SQL,利於開發除錯;正式環境建議設為 false 提升效能 |
Hibernate 支援 MySQL、Oracle、Sybase 等多種資料庫,雖然多數支援標準 SQL,但各有專屬方言(如分頁語法、鎖定語法差異)。hibernate.dialect 確保生成的 SQL 相容目標資料庫。Hibernate 安裝包 etc 目錄下提供各資料庫的組態範例可供參考。
持久化類別是指其實例需被 Hibernate 持久化至資料庫的類別,通常對應領域模型中的實體類別。持久化類別需符合 JavaBean 規範:
getXxx()/setXxx() 存取方法get/set + 屬性名首字大寫(如 name 對應 getName()/setName()),否則拋出 PropertyNotFoundExceptionisXxx() 或 getXxx() 皆可java.io.Serializable 介面,支援分散式環境與 HttpSession 序列化package mypack;
import java.io.Serializable;
import java.sql.Date;
import java.sql.Timestamp;
public class Customer implements Serializable {
private Long id;
private String name;
private String email;
private String password;
private int phone;
private boolean married;
private String address;
private char sex;
private String description;
private byte[] image;
private Date birthday;
private Timestamp registeredTime;
public Customer() {}
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
// 其餘 getter/setter 省略...
}
id 屬性為物件識別碼(OID),唯一標識每個 Customer 實例。若 customerA.getId().equals(customerB.getId()) 為 true,則代表兩者對應資料表中同一筆記錄。OID 通常為整數型別,亦可使用其他型別。
Customer 類別完全不依賴任何 Hibernate API,無需繼承特定基類或實作特定介面。這意味著:
這與傳統 EJB(CMP/BMP)必須運行於 EJB 容器形成鮮明對比,也是 Hibernate 輕量級、廣受歡迎的核心原因之一。
本文完整介紹了 Hibernate 的定位、組態檔建立、持久化類別設計規範與非侵入性優勢。下一章將深入探討對象關係映射文件(.hbm.xml)的撰寫細節,包含主鍵映射、屬性型別對應、集合映射等核心主題,並透過完整範例示範如何將 Customer 類別映射至 CUSTOMERS 資料表。