本系列記錄作者首個成功的 Hibernate 實戰專案,環境:Windows 2000 + JBuilder X + SQL Server 2000。核心亮點:將主鍵生成策略從資料庫 IDENTITY 遷移至 Hibernate 管理,體現 ORM 核心價值——持久化邏輯屬於應用層,而非資料庫層。
CREATE TABLE Houses (
HID int IDENTITY(1,1) PRIMARY KEY, -- SQL Server 自增
alias varchar(20),
description varchar(100),
capity int NOT NULL
);
-- 其他表 Menus, Tables, Customers, Staffs, Notice 同理使用 IDENTITY
關鍵變更:移除所有 IDENTITY(1,1),主鍵類型改為 INT,由 Hibernate <generator> 策略生成。
CREATE TABLE Houses (
HID INT PRIMARY KEY, -- 無 IDENTITY
alias VARCHAR(20),
description VARCHAR(100),
capity INT NOT NULL
);
-- 其他表同理:MID, TID, CID, SID, NID 均為 INT/VARCHAR PRIMARY KEY
| 策略 | 適用場景 | Hibernate 配置 | 優/缺點 |
|---|---|---|---|
increment | 單進程、單數據庫、開發測試 | <generator class="increment"/> | 內存計數器,重啟歸零,集群不安全 |
identity | 資料庫支援自增 (MySQL, SQL Server, PostgreSQL) | <generator class="identity"/> | 依賴資料庫,批次插入無法獲取 ID |
sequence | 支援 Sequence 的資料庫 (Oracle, PostgreSQL, DB2) | <generator class="sequence"/> | 高性能、可預分配、支援批次 |
native | 跨資料庫移植項目 | <generator class="native"/> | 自動選擇 identity/sequence/hilo,但行為不一致 |
assigned | 業務主鍵、自然鍵、外部系統同步 | <generator class="assigned"/> | 應用手動賦值,完全可控 |
uuid/guid | 分布式系統、無中心協調 | <generator class="uuid.hex"/> | 全局唯一、無序、索引性能稍弱 |
Houses 使用 increment:單機開發環境,簡單易用。identity 或自建 Sequence 模擬表;Oracle 必用 sequence;分布式微服務首選 uuid 或 Snowflake 算法。.hbm.xml 或 @GeneratedValue 中聲明,而非依賴 DDL IDENTITY,實現「持久化邏輯Java化」。下篇將展示:Eclipse/MyEclipse 逆向生成 POJO 與映射文件、hibernate.cfg.xml 配置、測試類編寫與驗證主鍵生成效果。