傳統 JDBC 開發痛點:樣板代碼多(連接、Statement、ResultSet、關閉資源)、SQL 與 Java 對象手動映射、數據庫移植困難、緩存機制缺失。Hibernate 作為 ORM(對象關系映射)框架,將 POJO 與數據庫表自動映射,提供透明持久化、一級/二級緩存、HQL 查詢語言、事務管理等能力,大幅提升開發效率與可維護性。

SessionFactory<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/db</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">123</property> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <property name="hibernate.show_sql">true</property> <property name="hibernate.format_sql">true</property> <property name="hibernate.hbm2ddl.auto">update</property> <!-- 自動建表/更新 --> <property name="hibernate.current_session_context_class">thread</property> <!-- 當前線程綁定 Session -->
| 元素 | 核心屬性 | 說明 |
|---|---|---|
| <hibernate-mapping> | package, schema, default-cascade, default-lazy, auto-import | 根元素,定義默認包名、Schema、級聯、懶加載策略 |
| <class> | name, table, dynamic-update, dynamic-insert, lazy, batch-size | 持久化類與表映射,支持動態 SQL、懶加載、批量抓取 |
| <id> | name, column, type, unsaved-value, generator | 主鍵映射,generator 指定生成策略 |
| <property> | name, column, type, update, insert, formula, access, lazy | 普通屬性映射,formula 支持計算屬性(子查詢) |
| <set/list/map/bag/array> | name, table, lazy, inverse, cascade, order-by, where, batch-size | 集合映射,inverse 控制關係維護方,cascade 級聯操作 |


| 狀態 | 特徵 | 轉換方法 |
|---|---|---|
| 瞬時態 | new 出來,無 ID,無關聯 Session,非事務管理 | save()、saveOrUpdate() → 持久態 |
| 持久態 | 有 ID,關聯 Session,在事務中,變更自動同步 DB(髒檢查) | delete() → 瞬時態;evict()/clear()/close() → 脫管態 |
| 脫管態 | 有 ID,無 Session 關聯,可自由修改 | update()、saveOrUpdate()、merge() → 持久態 |
關鍵機制:
save() 立即執行 INSERT 以獲取數據庫生成的 ID| 策略 | 適用場景 | 優點 | 缺點 | 配置示例 |
|---|---|---|---|---|
| assigned | 業務主鍵、外部分配 | 完全可控 | 需手動賦值,易衝突 | <generator class="assigned"/> |
| increment | 單進程、非集群 | 簡單、跨數據庫 | 不支持併發、集群不安全 | <generator class="increment"/> |
| identity | MySQL、SQL Server、DB2 | 數據庫原生自增,零配置 | 不支持 Oracle/PostgreSQL,批量插入性能差 | <generator class="identity"/> |
| sequence | Oracle、PostgreSQL、DB2 | 高性能、支持批量預分配 | 需創建 Sequence,跨庫遷移需改配置 | <generator class="sequence"><param name="sequence">SEQ_ID</param></generator> |
| native | 多數據庫部署 | 自適應底層數據庫(identity/sequence/hilo) | 行為不完全一致,調試稍難 | <generator class="native"/> |
| uuid | 分布式、無中心協調 | 全局唯一、無網絡開銷 | 占用空間大(36字符)、非有序、索引性能較差 | <generator class="uuid.hex"/> |
| foreign | 一對一共享主鍵 | 關聯對象共享 ID | 僅限一對一 | <generator class="foreign"><param name="property">user</param></generator> |
public class HibernateUtil {
private static final SessionFactory sessionFactory = buildSessionFactory();
private static final ThreadLocal<Session> threadLocal = new ThreadLocal<>();
private static SessionFactory buildSessionFactory() {
return new Configuration().configure().buildSessionFactory();
}
public static Session getCurrentSession() {
Session session = threadLocal.get();
if (session == null || !session.isOpen()) {
session = sessionFactory.openSession();
threadLocal.set(session);
}
return session;
}
public static void closeSession() {
Session session = threadLocal.get();
threadLocal.set(null);
if (session != null) session.close();
}
}
Hibernate 通過元數據驅動實現 ORM,核心在於理解 Session 生命週期、對象三態轉換、髒檢查與緩存機制。合理選擇主鍵策略、配置二級緩存、優化 N+1 查詢、控制事務邊界,是高性能 Hibernate 應用的關鍵。