在學習 Hibernate 時,許多初學者會從網路上參考程式碼片段,其中常見的查詢方法如下:
public static Object get(Class clazz, int id) {
Session session = null;
try {
session = HibernateUtil.getSession();
Object obj = session.get(clazz, id);
return obj;
} finally {
if (session != null) {
session.close();
}
}
}
然而,當嘗試編譯執行時,HibernateUtil.getSession() 這行會報錯:The method getSession() is undefined for the type HibernateUtil。
這個錯誤的原因很單純:HibernateUtil 是開發者自行撰寫的工具類別,並非 Hibernate 官方提供的標準 API。網路上流傳的範例程式碼通常假設你已經自行建立了包含 getSession() 方法的 HibernateUtil 類別,但實際上這個類別必須由開發者自己實作。
標準的 HibernateUtil 應該包含 SessionFactory 的建立與管理,以及提供 getSession() 方法。以下是完整的實作範例:
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtil {
private static final SessionFactory sessionFactory = buildSessionFactory();
private static SessionFactory buildSessionFactory() {
try {
// 載入 hibernate.cfg.xml 設定檔
return new Configuration().configure().buildSessionFactory();
} catch (Throwable ex) {
System.err.println("Initial SessionFactory creation failed." + ex);
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
public static Session getSession() {
return sessionFactory.openSession();
}
public static void shutdown() {
getSessionFactory().close();
}
}
hibernate.cfg.xml 設定檔。在現代 Spring 整合環境下,建議直接使用 Spring 的 HibernateTemplate 或 SessionFactory 注入方式,避免手動管理 Session 生命週期,減少資源洩漏風險。若使用 Spring Data JPA,則更不需要直接操作 Session。
遇到 HibernateUtil.getSession() undefined 錯誤時,請檢查專案中是否已正確建立 HibernateUtil 類別並實作 getSession() 方法。理解 SessionFactory 與 Session 的關係,是掌握 Hibernate 核心機制的基礎。