解析:
SessionFactory:線程安全、重量級對象,項目啟動時構建一次(解析映射、建立連接池),通常作為單例存放在 HibernateUtil 中。openSession():創建一個**新的** Session 對象。**Session 非線程安全**,每個業務請求/事務應使用獨立 Session。Session 代表一個工作單元,封裝了 JDBC Connection,提供增刪改查、事務管理、一級緩存等功能。最佳實踐:優先使用 getCurrentSession()(配合 hibernate.current_session_context_class=thread),由框架自動綁定當前線程、事務提交時自動關閉,避免手動管理洩漏。
解析:
List,需強轉為泛型 List<User>:List<User> users = (List<User>) session.createQuery(hql).list();解析:**完全合法**。Java 語法規定:
try塊後**必須**跟隨catch**或**finally(**至少一個**),兩者可共存。
場景:
try {
session.beginTransaction();
return session.createQuery(hql).list(); // 可能拋異常
} finally {
// 無論是否異常,必須執行清理
session.getTransaction().commit(); // 注意:異常時應 rollback
session.close();
}
缺陷警示:示例中 commit() 在 finally 中執行,**若查詢拋異常,事務應回滾而非提交**。正確模式:
Transaction tx = null;
try {
tx = session.beginTransaction();
List list = session.createQuery(hql).list();
tx.commit();
return list;
} catch (Exception e) {
if (tx != null) tx.rollback();
throw e; // 向上拋出
} finally {
session.close();
}
SessionFactory vs Session 生命週期,用 getCurrentSession() 簡化管理。@SuppressWarnings 是「欺騙編譯器」的權宜之計,慎用,優先修正泛型結構。try-finally 合法且常用於資源清理,但**事務提交/回滾邏輯必須在 try-catch 中正確處理**,不能單靠 finally。掌握這三點,能避開 Hibernate 入門 80% 的坑。