首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Hibernate 入門完整指南:ORM 核心概念、核心 API、運行流程與映射配置精要

     編輯:Java 綜合教學

什麼是 Hibernate?

  • 開源持久層框架
  • ORM (Object/Relational Mapping) 實現:建立物件模型與關係數據模型映射
  • Java 應用與資料庫的中介層
  • 對 JDBC 輕量級封裝:負責物件持久化,向上提供面向物件 API
  • 分層架構中處於持久層,封裝資料庫訪問細節,讓業務層專注業務邏輯

ORM 核心映射關係

Hibernate 核心軟體包 (傳統 3.x/4.x 手動管理)

面向物件概念面向關係概念
Class (類)Table (表)
Object (物件/實例)Row / Record (行/記錄)
Property / Field (屬性/欄位)Column (列/字段)

現代專案:僅在 pom.xml 引入 org.hibernate:hibernate-core,Maven 自動解決所有遞移依賴。

核心 API 介面體系

JAR 檔用途必要性
hibernate3.jar核心框架與 API✅ 必須
cglib-2.1.2.jar位元碼增強 (延遲載入代理)✅ 必須
dom4j-1.6.1.jarXML 解析 (讀取映射檔)✅ 必須
commons-collections.jar增強集合工具✅ 必須
commons-logging.jar日誌門面✅ 必須
c3p0-0.9.0.jar連線池 (可選,推薦 HikariCP)⚙️ 可選
jta.jarJTA 事務規範 (應用伺服器通常內建)⚙️ 環境提供
antlr, javassist, slf4j-api 等現代版本 (5.x/6.x) 由 Maven 遞移管理📦 現代專案無需手動管理
介面核心職責關鍵方法
Configuration配置 Hibernate、啟動、建立 SessionFactoryconfigure(), buildSessionFactory()
SessionFactory重量級、線程安全、單例、建立 Session、管理二級快取openSession(), getCurrentSession()
Session輕量級、非線程安全、持久化管理器 (CRUD)、一級快取save(), get(), load(), update(), delete(), createQuery()
Transaction事務抽象 (JDBC/JTA/CORBA 統一 API)begin(), commit(), rollback()
QueryHQL 查詢、參數綁定、分頁、執行setParameter(), list(), uniqueResult(), setFirstResult()
Criteria完全物件化動態查詢 (Hibernate 5.2+ 棄用,改用 JPA CriteriaBuilder)add(), addOrder(), list()

回調與擴充介面

  • Interceptor:攔截器,響應載入/儲存/更新/刪除事件 (推薦)
  • Lifecycle / Validatable:侵入式,持久化類實現特定介面 (不推薦)
  • UserType / CompositeUserType:自訂型別映射
  • IdentifierGenerator:自訂主鍵生成策略
  • Dialect:資料庫方言擴充
  • CacheProvider:二級快取實現
  • ConnectionProvider:連線管理擴充

Hibernate 運行流程

  1. 應用啟動:Configuration 讀取 hibernate.cfg.xml + *.hbm.xml
  2. 建立 SessionFactory (重量級、單例、緩存元資料/ SQL/ 二級快取)
  3. 業務操作:SessionFactory.openSession() 獲取 Session
  4. 開啟事務:session.beginTransaction()
  5. 執行操作:
    • CRUD:session.save/get/load/update/delete/saveOrUpdate(entity)
    • 查詢:session.createQuery(hql) → Query → list()
  6. 提交事務:tx.commit() (Flush → SQL 執行 → Commit)
  7. 異常回滾:tx.rollback()
  8. 關閉 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) 減少資料庫壓力
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved