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

Hibernate 入門核心指南:從 ORM 原理到實戰 DAO 封裝

     編輯:Java 綜合教學

Hibernate 快速上手:持久層核心技術全解析

Hibernate 是 Java 領域最經典的開源 ORM(Object-Relational Mapping)框架,它將面向對象模型映射到關係數據庫模型,讓開發者用對象思維操作數據庫,極大提升持久層開發效率。本文涵蓋核心組件、配置詳解、主鍵策略、Session 生命周期、事務管理及通用 BaseDAO 封裝實戰。

一、核心架構與組件

  • SessionFactory:重量級、線程安全、應用級單例,對應一個數據庫,負責創建 Session、緩存管理、連接池。
  • Session:輕量級、非線程安全、請求級/事務級,代表一次數據庫會話,提供 CRUD、查詢、事務邊界。
  • Transaction:統一事務 API,屏蔽底層 JDBC/JTA 差異。

二、核心配置文件詳解

hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "https://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
  <session-factory>
    <!-- 數據庫連接 -->
    <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
    <property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
    <property name="connection.username">scott</property>
    <property name="connection.password">tiger</property>
    <!-- 方言:生成特定 SQL -->
    <property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>
    <!-- 當前會話上下文綁定線程 -->
    <property name="current_session_context_class">thread</property>
    <property name="show_sql">true</property>
    <!-- 映射文件 -->
    <mapping resource="com/it/bean/UserInfo.hbm.xml"/>
  </session-factory>
</hibernate-configuration>

映射文件 UserInfo.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "https://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.it.bean">
  <class name="UserInfo" table="userinfo">
    <id name="user_id" column="user_id">
      <generator class="assigned"/> <!-- 主鍵策略 -->
    </id>
    <property name="user_name" column="user_name"/>
    <property name="user_sex" column="user_sex"/>
    <property name="user_birth" column="user_birth"/>
    <property name="user_addr" column="user_addr"/>
    <property name="user_pwd" column="user_pwd"/>
  </class>
</hibernate-mapping>

三、主鍵生成策略全景表

策略適用場景備註
assigned業務主鍵、外部生成需手動賦值
identityMySQL、SQL Server、DB2 自增列依賴數據庫自增
sequenceOracle、PostgreSQL Sequence需創建序列
hilo高並發、需獨立表存儲 hi 值較少用
seqhiloOracle 等支持 Sequence 的數據庫hi 值存 Sequence
increment單進程單實例、內存計數器集群環境禁用
native跨數據庫移植自動選 identity/sequence/hilo
uuid.hex高性能、去中心化、無需數據庫協調32 位十六進制字符串
foreign一對一關聯主鍵引用外部表主鍵

四、Session 與事務標準模式

SessionFactory sf = new Configuration().configure().buildSessionFactory();
Session session = sf.getCurrentSession(); // 綁定線程
Transaction tx = null;
try {
    tx = session.beginTransaction();
    // 業務操作:save/update/delete/get/createQuery
    tx.commit();
} catch (Exception e) {
    if (tx != null) tx.rollback();
    throw e;
} finally {
    // 若非 thread 上下文需手動 close;thread 模式由框架管理
}

五、通用 BaseDAO 封裝實戰

public class BaseDAO<T> {
    private SessionFactory getSF() {
        return SessionFactoryUtils.getSessionFactory(); // 工具類單例
    }
    // 通用查詢
    public List<T> find(String hql) {
        Session s = getSF().getCurrentSession();
        Transaction tx = s.beginTransaction();
        List<T> list = s.createQuery(hql).list();
        tx.commit(); return list;
    }
    public List<T> find(String hql, Object... params) {
        Session s = getSF().getCurrentSession();
        Transaction tx = s.beginTransaction();
        Query q = s.createQuery(hql);
        for (int i = 0; i < params.length; i++) q.setParameter(i, params[i]);
        List<T> list = q.list();
        tx.commit(); return list;
    }
    // 增刪改
    public void save(Object obj) { exec(s -> s.save(obj)); }
    public void delete(Object obj) { exec(s -> s.delete(obj)); }
    public void update(Object obj) { exec(s -> s.update(obj)); }
    public void deleteById(Class<T> clazz, Serializable id) {
        Object obj = get(clazz, id); if (obj != null) delete(obj);
    }
    public T get(Class<T> clazz, Serializable id) {
        Session s = getSF().getCurrentSession();
        Transaction tx = s.beginTransaction();
        T t = (T) s.get(clazz, id);
        tx.commit(); return t;
    }
    private void exec(Consumer<Session> action) {
        Session s = getSF().getCurrentSession();
        Transaction tx = s.beginTransaction();
        try { action.accept(s); tx.commit(); }
        catch (Exception e) { tx.rollback(); throw e; }
    }
}

六、常見依賴包清單

  • hibernate-core
  • hibernate-entitymanager (JPA 支持)
  • hibernate-c3p0 / hikariCP (連接池)
  • slf4j-api + logback (日志)
  • 數據庫驅動
  • dom4j、jta、antlr 等傳遞依賴

七、最佳實踐提示

  1. SessionFactory 單例,應用啟動時構建,關閉時釋放。
  2. 優先使用 getCurrentSession() 配合 current_session_context_class=thread,避免手動管理。
  3. 事務邊界清晰:Service 層開啟/提交/回滾,DAO 僅負責操作。
  4. 大數據量查詢使用 scroll() 或分頁,避免 OOM。
  5. 映射文件建議按模塊拆分,package 屬性簡化全限定名。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved