提供單例模式的 SessionFactory 存取點,同時相容:
SessionFactorySessionFactorypackage com;
import net.sf.hibernate.SessionFactory;
import net.sf.hibernate.cfg.Configuration;
import javax.naming.InitialContext;
public class HibernateInit {
private static HibernateInit instance = null;
private static SessionFactory sessionFactory;
private static String runType = "web"; // "web" 或 "junit"
public static void setRunType(String type) {
runType = type;
}
public synchronized static HibernateInit getInstance() {
if (instance == null) {
instance = new HibernateInit();
}
return instance;
}
private HibernateInit() {
initSessionFactory();
}
private void initSessionFactory() {
Configuration conf;
try {
if (runType != null && runType.equalsIgnoreCase("junit")) {
// 單元測試模式:載入本地設定檔
java.net.URL configFileURL = GenerateDataBaseUtil.class.getResource("/hibernate_GenerateDB.cfg.xml");
conf = new Configuration().configure(configFileURL);
sessionFactory = conf.buildSessionFactory();
} else {
// Web 容器模式:JNDI 查找
InitialContext ctx = new InitialContext();
sessionFactory = (SessionFactory) ctx.lookup("hibernate/session_factory");
}
} catch (Exception e) {
e.printStackTrace();
}
}
public SessionFactory getSessionFactory() {
return sessionFactory;
}
}
透過靜態變數 runType 控制初始化策略,測試程式啟動時呼叫 HibernateInit.setRunType("junit") 即可切換。
SessionFactory 為執行緒安全且建構昂貴,全應用僅需一個實例。雙重檢查鎖定確保執行緒安全與效能。
hibernate.cfg.xml 部署於 CLASSPATH,伺服器啟動時綁定 JNDIhibernate_GenerateDB.cfg.xml 專用於單元測試(如建表、資料初始化)建議將 printStackTrace() 替換為日誌框架,並拋出受檢異常讓呼叫端決定處理策略。可進一步加入:
// Web 環境(Struts Action / Spring Bean 中)
SessionFactory sf = HibernateInit.getInstance().getSessionFactory();
Session session = sf.openSession();
// 單元測試
public class HibernateTest extends TestCase {
protected void setUp() {
HibernateInit.setRunType("junit");
}
public void testSave() {
SessionFactory sf = HibernateInit.getInstance().getSessionFactory();
// ...
}
}
此工具類為早期 Hibernate 2.x/3.x 專案提供了實用的環境適配方案,體現了「配置與程式碼分離」的良好實踐。