Hibernate 是開源對象關係映射(ORM)框架,封裝 JDBC,提供高性能對象持久化服務。其核心價值:用面向對象方式操作數據(HQL),橋接對象模型與關係數據庫。
程序中用對象操作數據,持久化時轉為關係表記錄。ORM 即對象-關係映射機制,自動完成雙向轉換。
| 狀態 | 定義 | 關鍵特徵 | 轉換方法 |
|---|---|---|---|
| 自由態 | 新建對象,未關聯 Session,無數據庫記錄 | 非托管、無 OID | save()、persist() → 持久態 |
| 持久態 | 關聯 Session,有 OID,數據庫有對應記錄 | 托管、自動髒檢查、事務提交同步更新 | delete() → 自由態;Session.close() → 游離態 |
| 游離態 | 原持久對象,Session 關閉後 | 非托管、有 OID、數據庫可能有記錄 | update()、saveOrUpdate()、lock() → 持久態 |
SessionFactory 線程安全,Session 非線程安全。多線程共享 Session 會導致數據混亂。
private static final ThreadLocal<Session> threadLocal = new ThreadLocal<>();
public Session getSession() {
Session session = threadLocal.get();
if (session == null) {
session = sessionFactory.openSession();
threadLocal.set(session);
}
return session;
}
每線程獨享 Session 副本,用完必須手動關閉並移除threadLocal.remove(),防止內存洩漏。
| 特性 | openSession() | getCurrentSession() |
|---|---|---|
| 綁定線程 | 否 | 是(需配置 hibernate.current_session_context_class) |
| 關閉方式 | 手動 close() | 事務提交/回滾自動關閉 |
| 適用場景 | 長會話、手動控制 | Spring 管理、請求級會話 |
save():立即生成 OID,計劃 INSERT,事務提交前修改屬性會觸發額外 UPDATEpersist():JPA 標準,不保證立即生成 OID,事務邊界外不執行 INSERT| 方法 | 無記錄時 | 加載策略 | 適用場景 |
|---|---|---|---|
load() | 拋 ObjectNotFoundException | 延遲加載(代理) | 刪除、建立關聯(不需立即訪問屬性) |
get() | 返回 null | 立即加載 | 需訪問屬性、業務判斷 |