| JAR 檔 | 用途 | 必要性 |
| hibernate3.jar | 核心框架與 API | ✅ 必須 |
| cglib-2.1.2.jar | 位元碼增強 (延遲載入代理) | ✅ 必須 |
| dom4j-1.6.1.jar | XML 解析 (讀取映射檔) | ✅ 必須 |
| commons-collections.jar | 增強集合工具 | ✅ 必須 |
| commons-logging.jar | 日誌門面 | ✅ 必須 |
| c3p0-0.9.0.jar | 連線池 (可選,推薦 HikariCP) | ⚙️ 可選 |
| jta.jar | JTA 事務規範 (應用伺服器通常內建) | ⚙️ 環境提供 |
| antlr, javassist, slf4j-api 等 | 現代版本 (5.x/6.x) 由 Maven 遞移管理 | 📦 現代專案無需手動管理 |
現代專案:僅在 pom.xml 引入 org.hibernate:hibernate-core,Maven 自動解決所有遞移依賴。
核心 API 介面體系
| 介面 | 核心職責 | 關鍵方法 |
| Configuration | 配置 Hibernate、啟動、建立 SessionFactory | configure(), buildSessionFactory() |
| SessionFactory | 重量級、線程安全、單例、建立 Session、管理二級快取 | openSession(), getCurrentSession() |
| Session | 輕量級、非線程安全、持久化管理器 (CRUD)、一級快取 | save(), get(), load(), update(), delete(), createQuery() |
| Transaction | 事務抽象 (JDBC/JTA/CORBA 統一 API) | begin(), commit(), rollback() |
| Query | HQL 查詢、參數綁定、分頁、執行 | setParameter(), list(), uniqueResult(), setFirstResult() |
| Criteria | 完全物件化動態查詢 (Hibernate 5.2+ 棄用,改用 JPA CriteriaBuilder) | add(), addOrder(), list() |
回調與擴充介面
- Interceptor:攔截器,響應載入/儲存/更新/刪除事件 (推薦)
- Lifecycle / Validatable:侵入式,持久化類實現特定介面 (不推薦)
- UserType / CompositeUserType:自訂型別映射
- IdentifierGenerator:自訂主鍵生成策略
- Dialect:資料庫方言擴充
- CacheProvider:二級快取實現
- ConnectionProvider:連線管理擴充
Hibernate 運行流程
- 應用啟動:
Configuration 讀取 hibernate.cfg.xml + *.hbm.xml
- 建立
SessionFactory (重量級、單例、緩存元資料/ SQL/ 二級快取)
- 業務操作:
SessionFactory.openSession() 獲取 Session
- 開啟事務:
session.beginTransaction()
- 執行操作:
- CRUD:
session.save/get/load/update/delete/saveOrUpdate(entity)
- 查詢:
session.createQuery(hql) → Query → list()
- 提交事務:
tx.commit() (Flush → SQL 執行 → Commit)
- 異常回滾:
tx.rollback()
- 關閉 Session:
session.close() (歸還連線、清理一級快取)
程式碼範例
// 1. 啟動
Configuration cfg = new Configuration().configure(); // 讀取 hibernate.cfg.xml
SessionFactory sf = cfg.buildSessionFactory();
// 2. 業務操作
Session session = sf.openSession();
Transaction tx = session.beginTransaction();
try {
// 儲存
Customer c = new Customer("John", "john@example.com");
session.save(c);
// 查詢
List list = session.createQuery("from Customer").list();
tx.commit();
} catch (Exception e) {
tx.rollback();
throw e;
} finally {
session.close();
}
// 3. 關閉 (應用關閉時)
sf.close();
映射配置精要 (XML 方式)
1. 基本類映射
<class name="com.example.Customer" table="T_CUSTOMER">
<id name="id" column="ID">
<generator class="native"/> <!-- 主鍵生成策略 -->
</id>
<property name="name" column="NAME" length="50" not-null="true"/>
<property name="email" column="EMAIL" unique="true"/>
<property name="createTime" column="CREATE_TIME" type="timestamp"/>
</class>
2. 關聯映射
<!-- 多對一 (多方維護外鍵) -->
<many-to-one name="customer" column="CUSTOMER_ID" class="com.example.Customer" fetch="select"/>
<!-- 一對多 (雙向關聯,一方用 set/inverse) -->
<set name="orders" inverse="true" cascade="all-delete-orphan">
<key column="CUSTOMER_ID"/>
<one-to-many class="com.example.Order"/>
</set>
<!-- 多對多 (中間表) -->
<set name="roles" table="T_USER_ROLE">
<key column="USER_ID"/>
<many-to-many column="ROLE_ID" class="com.example.Role"/>
</set>
3. 派生屬性與公式
<property name="totalAmount" formula="(SELECT SUM(o.AMOUNT) FROM T_ORDER o WHERE o.CUSTOMER_ID = ID)"/>
<property name="fullName" formula="CONCAT(FIRST_NAME, ' ', LAST_NAME)"/>
現代化:JPA 註解替代 XML (Hibernate 5+ / Spring Data JPA)
@Entity
@Table(name = "T_CUSTOMER")
public class Customer {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "NAME", nullable = false, length = 50)
private String name;
@Column(name = "EMAIL", unique = true)
private String email;
@OneToMany(mappedBy = "customer", cascade = CascadeType.ALL, orphanRemoval = true)
private Set orders = new HashSet<>();
// Getter/Setter...
}
常見坑與最佳實踐
- ❌
Session 當成實例變數 / 多執行緒共用 → 非線程安全,請求級別建立關閉
- ❌ 忘記
tx.commit() / 異常未 rollback() → 資料不一致
- ❌ 大量資料用
session.save() 循環 → 使用 session.flush() + session.clear() 批次插入或 StatelessSession
- ❌ N+1 查詢:關聯預設延遲載入,列表頁需
fetch="join" 或 HQL join fetch
- ❌
equals/hashCode 僅用 ID 實現 → Set/快取失效,需包含業務鍵
- ✅
SessionFactory 單例、Session 請求範圍
- ✅ 優先使用 JPA 註解,標準化、IDE 支援好、可移植
- ✅ 開啟
hibernate.show_sql=true 開發期調試,生產關閉
- ✅ 合理配置二級快取 (Ehcache/Redis) 減少資料庫壓力
- 上一篇文章: JSP Model 1 vs Model 2 (MVC) 架構完整對比與實戰代碼
- 下一篇文章: Java Web (J2EE) 學習路線圖全景指南:J2SE 基礎、J2EE 進階、資料庫、前端、工具鏈與職涯建議
Copyright ©
程式碼之家 All Rights Reserved