在 WebLogic 等 J2EE 容器中部署 Hibernate,應將 SessionFactory 綁定至 JNDI,讓 EJB、Servlet 透過 JNDI Lookup 共享同一個 SessionFactory,並配合容器管理交易 (CMT) 使用容器提供的 DataSource。本文詳細說明設定步驟。
修改 Domain 下的 startWebLogic.cmd,在啟動命令前插入 Classpath 設定:
@rem set hibernate classpath
set HIBERNATE_LIB=D:\test\oracle\lib
set HIBERNATE_CLASSES=D:\test\oracle\classes
set CLASSPATH=%HIBERNATE_LIB%\cglib-asm.jar;%HIBERNATE_LIB%\commons-beanutils.jar;%HIBERNATE_LIB%\commons-collections.jar;%HIBERNATE_LIB%\commons-lang.jar;%HIBERNATE_LIB%\commons-logging.jar;%HIBERNATE_LIB%\dom4j-full.jar;%HIBERNATE_LIB%\hibernate2.jar;%HIBERNATE_LIB%\jcs.jar;%HIBERNATE_LIB%\log4j-1.2.8.jar;%HIBERNATE_LIB%\odmg.jar;%HIBERNATE_CLASSES%;%CLASSPATH%
@rem Call Weblogic Server
call "C:\bea\weblogic700\server\bin\startWLS.cmd"
確保所有 Hibernate 相關 JAR、專案編譯類別與設定檔 (hibernate.properties, log4j.properties) 皆在 Classpath 中。
mypool。使用 EJB/CMT 時,必須使用 WebLogic 提供的 Tx DataSource,不可使用 Hibernate 內建或第三方連線池,否則容器無法管理資料庫交易。
hibernate.dialect net.sf.hibernate.dialect.OracleDialect
hibernate.connection.datasource mypool
hibernate.connection.provider_class net.sf.hibernate.connection.DatasourceConnectionProvider
hibernate.session_factory_name hibernate.session_factory
# 效能調校參數
hibernate.jdbc.fetch_size 50
hibernate.jdbc.batch_size 25
hibernate.session_factory_name在 WebLogic 中需用點號hibernate.session_factory,但程式碼 Lookup 時仍用斜線hibernate/session_factory。
實作 weblogic.common.T3StartupDef,在 WebLogic 啟動時建立 SessionFactory,Hibernate 會自動綁定至 JNDI。
package com.fankai;
import java.util.Hashtable;
import weblogic.common.T3StartupDef;
import weblogic.common.T3ServicesDef;
import net.sf.hibernate.cfg.Configuration;
import net.sf.hibernate.SessionFactory;
public class HibernateStartUp implements T3StartupDef {
public void setServices(T3ServicesDef services) {}
public String startup(String name, Hashtable args) throws Exception {
Configuration conf = new Configuration().addClass(Cat.class); // 替換為實際實體類別
SessionFactory sf = conf.buildSessionFactory();
return "Hibernate Startup completed successfully";
}
}
編譯時需引入 weblogic.jar 及所有 Hibernate 相關 JAR。將編譯產生的 HibernateStartUp.class 放入已加入 Classpath 的目錄 (如 D:\test\oracle\classes)。
com.fankai.HibernateStartUp,Apply。myserver 移至 Chosen,Apply。hibernate 節點,下掛 session_factory,類別為 net.sf.hibernate.impl.SessionFactoryImpl。Context ctx = new InitialContext();
SessionFactory sf = (SessionFactory) ctx.lookup("hibernate/session_factory");
本質相同:確保在應用啟動前執行 Configuration().buildSessionFactory(),並設定 hibernate.session_factory_name 為該容器 JNDI 命名規則的名稱。