準備工作
- 數據庫:MySQL,創建 database
hibernateTest
- JAR 包:Hibernate 5.6.x + MySQL Connector/J 8.0.x + SLF4J 綁定
- IDE:Eclipse / IntelliJ IDEA
1. Hibernate 核心配置文件 hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "https://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 數據庫連接 -->
<property name="connection.driver_class">com.mysql.cj.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/hibernateTest?useSSL=false&serverTimezone=UTC</property>
<property name="connection.username">root</property>
<property name="connection.password">123456</property>
<!-- Hibernate 方言 -->
<property name="dialect">org.hibernate.dialect.MySQL8Dialect</property>
<!-- 控制台打印 SQL -->
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<!-- 自動建表策略:update 保留數據,create 重建,validate 只校驗 -->
<property name="hbm2ddl.auto">update</property>
<!-- 映射文件 -->
<mapping resource="com/jbit/entity/User/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
2. 持久化類 User
package com.jbit.entity.User;
public class User {
private int id;
private String name;
private int age;
// 構造器、getter/setter、toString 省略
}
3. 映射文件 User.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "https://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.jbit.entity.User.User" table="USER">
<id name="id" type="java.lang.Integer">
<column name="ID"/>
<generator class="native"/> <!-- 主鍵生成策略:MySQL 自增 -->
</id>
<property name="name" column="NAME" type="string"/>
<property name="age" column="AGE" type="int"/>
</class>
</hibernate-mapping>
4. 測試代碼:保存對象
package com.jbit.entity.User;
import org.hibernate.*;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import org.junit.Test;
public class HibernateTest {
@Test
public void testSave() {
// 1. Configuration 讀取配置與映射
Configuration cfg = new Configuration().configure();
// 2. ServiceRegistry (Hibernate 4+ 必須)
ServiceRegistry sr = new ServiceRegistryBuilder()
.applySettings(cfg.getProperties())
.buildServiceRegistry();
// 3. SessionFactory (線程安全、重量級、應用級單例)
SessionFactory sf = cfg.buildSessionFactory(sr);
// 4. Session (線程不安全、輕量級、請求級)
Session session = sf.openSession();
// 5. 開啟事務
Transaction tx = session.beginTransaction();
try {
// 6. 執行保存
User user = new User("Java12345", 10);
session.save(user); // 持久化狀態
// 7. 提交事務
tx.commit();
System.out.println("保存成功,生成 ID=" + user.getId());
} catch (Exception e) {
tx.rollback();
throw e;
} finally {
// 8. 關閉資源
session.close();
sf.close();
}
}
}
5. 運行結果驗證
- 控制台打印格式化 SQL:
insert into USER (NAME, AGE) values (?, ?)
- MySQL 數據庫自動創建
USER 表,插入一條記錄,ID 自增。
- 對象
user 的 id 被回寫。
核心概念釐清
| 概念 | 生命周期 | 線程安全 | 作用 |
| Configuration | 啟動時一次 | 是 | 解析配置、構建元數據 |
| ServiceRegistry | 啟動時一次 | 是 | 服務容器,管理內部服務 |
| SessionFactory | 應用級單例 | 是 | 緩存元數據、生產 Session、二級緩存 |
| Session | 請求/事務級 | 否 | 一級緩存、執行 CRUD、管理事務 |
| Transaction | 事務級 | 否 | 邊界控制、ACID |
避坑指南
- hbm2ddl.auto:開發用
update,測試用 create-drop,**生產嚴禁非 validate**!
- Session 必須關閉:否則連接洩漏、一級緩存膨脹、數據庫連接池耗盡。
- 異常必須回滾:
tx.rollback() 在 catch 塊中,防止髒數據提交。
- 映射文件路徑:
resource 使用 classpath 相對路徑,包名用 / 分隔。
- MySQL 8+ 驅動類:
com.mysql.cj.jdbc.Driver,URL 加 useSSL=false&serverTimezone=UTC。
下一步
- 註解配置 (
@Entity, @Table, @Id, @GeneratedValue) 替換 XML
- 關聯映射:一對多、多對一、多對多
- HQL / Criteria / Native SQL 查詢
- 緩存策略:一級/二級/查詢緩存