Hibernate 是基於 ORM(Object-Relational Mapping,對象關係映射) 的持久層框架,本質上是對 JDBC 的輕量級封裝,旨在簡化資料庫 CRUD(Create、Retrieve、Update、Delete) 操作。註:原文寫作 CUPD,實為 CRUD 之誤。
| 名稱 | 職責 |
|---|---|
Session | 負責持久化操作(增刪改查),非線程安全,生命週期短,請勿跨線程共用。 |
SessionFactory | 重量級、線程安全,負責初始化配置、建立 Session,通常作為單例存在。 |
Transaction | 管理事務邊界(begin/commit/rollback)。 |
Query | 執行 HQL 或原生 SQL 查詢,支援參數綁定、分頁限制。 |
Criteria | 面向對象的標準化查詢 API,輕量級,必須在 Session 內使用。 |
Configuration | 啟動時讀取映射文件(.hbm.xml / hibernate.cfg.xml),構建 SessionFactory,生命週期極短。 |
Configuration 並載入 hibernate.cfg.xmlSessionFactorySessionSession 執行 CRUDSession 釋放資源public class HibernateTest {
public void testCrud() {
// 1~2. 配置與 SessionFactory
Configuration cfg = new Configuration().configure("hibernate.cfg.xml");
SessionFactory sf = cfg.buildSessionFactory();
// 3. 開啟 Session
Session session = sf.openSession();
// 4. 開啟事務
Transaction tx = session.beginTransaction();
try {
// 5. CRUD 範例
User user = new User();
user.setName("Washington");
session.save(user); // 新增
// session.delete(user); // 刪除
// session.update(user); // 修改
// User u = session.get(User.class, id); // 主鍵查詢
// HQL 查詢
Query query = session.createQuery("from User");
List<User> list = query.list();
// 原生 SQL
SQLQuery sqlQ = session.createSQLQuery("select * from User").addEntity(User.class);
List<User> sqlList = sqlQ.list();
// Criteria 查詢
Criteria criteria = session.createCriteria(User.class);
criteria.add(Restrictions.ilike("name", "Washington%"));
// 6. 提交事務
tx.commit();
} catch (Exception e) {
if (tx != null) tx.rollback();
throw e;
} finally {
// 7. 關閉 Session
session.close();
}
}
}
Session 非線程安全,Web 環境請採用 ThreadLocal 或 Spring 的 OpenSessionInViewFilter 管理。ScrollableResults 或批次處理,避免 OOM。