首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Hibernate 初始化工具類:支援 Web 容器與單元測試雙環境

     編輯:Java 相關知識

設計目標

提供單例模式的 SessionFactory 存取點,同時相容:

  • Web 環境:透過 JNDI 從應用伺服器查找已配置的 SessionFactory
  • 單元測試環境:直接載入本地設定檔建立 SessionFactory

核心程式碼解析

package 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;
    }
}

關鍵設計細節

1. 雙環境切換機制

透過靜態變數 runType 控制初始化策略,測試程式啟動時呼叫 HibernateInit.setRunType("junit") 即可切換。

2. 單例模式保證唯一 SessionFactory

SessionFactory 為執行緒安全且建構昂貴,全應用僅需一個實例。雙重檢查鎖定確保執行緒安全與效能。

3. 設定檔分離

  • Web 環境:hibernate.cfg.xml 部署於 CLASSPATH,伺服器啟動時綁定 JNDI
  • 測試環境:hibernate_GenerateDB.cfg.xml 專用於單元測試(如建表、資料初始化)

4. 異常處理與擴充性

建議將 printStackTrace() 替換為日誌框架,並拋出受檢異常讓呼叫端決定處理策略。可進一步加入:

  • 設定檔路徑外部化(系統屬性或環境變數)
  • 多資料源支援(Map 儲存多個 SessionFactory)
  • 攔截器、事件監聽器自動註冊

使用範例

// 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 專案提供了實用的環境適配方案,體現了「配置與程式碼分離」的良好實踐。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved