Hibernate 是 Java 領域最經典的開源 ORM(Object-Relational Mapping)框架,它將面向對象模型映射到關係數據庫模型,讓開發者用對象思維操作數據庫,極大提升持久層開發效率。本文涵蓋核心組件、配置詳解、主鍵策略、Session 生命周期、事務管理及通用 BaseDAO 封裝實戰。
<?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>
<?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 | 業務主鍵、外部生成 | 需手動賦值 |
| identity | MySQL、SQL Server、DB2 自增列 | 依賴數據庫自增 |
| sequence | Oracle、PostgreSQL Sequence | 需創建序列 |
| hilo | 高並發、需獨立表存儲 hi 值 | 較少用 |
| seqhilo | Oracle 等支持 Sequence 的數據庫 | hi 值存 Sequence |
| increment | 單進程單實例、內存計數器 | 集群環境禁用 |
| native | 跨數據庫移植 | 自動選 identity/sequence/hilo |
| uuid.hex | 高性能、去中心化、無需數據庫協調 | 32 位十六進制字符串 |
| foreign | 一對一關聯主鍵 | 引用外部表主鍵 |
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 模式由框架管理
}
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; }
}
}
getCurrentSession() 配合 current_session_context_class=thread,避免手動管理。scroll() 或分頁,避免 OOM。package 屬性簡化全限定名。