WebLogic 8.1 (2004 年發布) 採用模組化類載入器架構,Hibernate 需要的大量第三方庫 (CGLIB, Commons Collections, Dom4j 等) 若放置不當,極易導致 ClassNotFoundException、NoClassDefFoundError 或 LinkageError。本文提供經實戰驗證的完整整合步驟,涵蓋啟動腳本配置、JDBC 數據源、Hibernate 配置、啟動類初始化 SessionFactory 等關鍵環節。
D:\testprj\
├── lib\ # 所有 Hibernate 相關 JAR
├── classes\ # 編譯類、Hibernate 配置檔、映射檔
└── src\ # 源碼
編輯 D:\bea\user_projects\domains\mydomain\startWebLogic.cmd,在 set CLASSPATH=... 之後插入:
@rem ====== Hibernate Classpath 注入 START ======
set HIBERNATE_LIB=D:\testprj\lib
set HIBERNATE_CLASSES=D:\testprj\classes
set CLASSPATH=%HIBERNATE_LIB%\cglib-asm.jar;
%HIBERNATE_LIB%\cglib-full-2.0.1.jar;
%HIBERNATE_LIB%\ehcache-0.7.jar;
%HIBERNATE_LIB%\commons-beanutils.jar;
%HIBERNATE_LIB%\commons-logging-1.0.3.jar;
%HIBERNATE_LIB%\commons-collections-2.1.jar;
%HIBERNATE_LIB%\commons-lang.jar;
%HIBERNATE_LIB%\commons-logging.jar;
%HIBERNATE_LIB%\dom4j-full.jar;
%HIBERNATE_LIB%\jcs.jar;
%HIBERNATE_LIB%\log4j-1.2.8.jar;
%HIBERNATE_LIB%\odmg.jar;
%HIBERNATE_LIB%\dom4j-1.4.jar;
%HIBERNATE_LIB%\hibernate2.jar;
%HIBERNATE_CLASSES%;
%CLASSPATH%
@rem ====== Hibernate Classpath 注入 END ======
關鍵要求:set CLASSPATH= **必須寫在單行**,不能換行或有多餘空格,否則 WebLogic 啟動失敗或 WinRAR 解壓報錯。
https://localhost:7001/console)。misdb。在 D:\testprj\classes\hibernate.properties 中配置 (或 hibernate.cfg.xml 二擇一):
# 方言:Sybase
hibernate.dialect=net.sf.hibernate.dialect.SybaseDialect
# 核心:使用 JNDI DataSource,非 JDBC 直連
hibernate.connection.datasource=misdb
hibernate.connection.provider_class=net.sf.hibernate.connection.DatasourceConnectionProvider
# 將 SessionFactory 綁定到 JNDI (供其他組件查找)
hibernate.session_factory_name=java:hibernate/SessionFactory
# 效能優化
hibernate.jdbc.fetch_size=50
hibernate.jdbc.batch_size=25
# 關閉預設連接配置 (避免衝突)
# hibernate.connection.driver_class=...
# hibernate.connection.url=...
# hibernate.connection.username=...
# hibernate.connection.password=...
注意:註釋掉所有 JDBC 直連相關配置,確保唯一生效的是 JNDI DataSource 方案。
WebLogic JNDI 實作不完全支援 Referenceable,直接在 hibernate.cfg.xml 配置 <property name="session_factory_name"> 可能失效。需編寫啟動類在伺服器啟動時主動構建並綁定。
package com.myapp.startup;
import net.sf.hibernate.Configuration;
import net.sf.hibernate.SessionFactory;
import weblogic.common.T3StartupDef;
import weblogic.common.T3ServicesDef;
public class HibernateStartup implements T3StartupDef {
public void startup(String name, Hashtable args) throws Exception {
System.out.println(">>> 初始化 Hibernate SessionFactory...");
// 1. 載入配置 (自動讀取 classpath 下的 hibernate.properties)
Configuration cfg = new Configuration();
// 若用 hibernate.cfg.xml: new Configuration().configure();
// 2. 構建 SessionFactory (此過程會解析映射、驗證、建立連線池)
SessionFactory factory = cfg.buildSessionFactory();
// 3. 手動綁定到 JNDI (可選,若 hibernate.session_factory_name 配置生效則可省略)
// Context ctx = new InitialContext();
// ctx.rebind("java:hibernate/SessionFactory", factory);
System.out.println(">>> Hibernate SessionFactory 初始化完成並綁定至 JNDI。");
}
public void setServices(T3ServicesDef services) { }
}
D:\testprj\classes。HibernateInit, Class: com.myapp.startup.HibernateStartup, Deployment: 選目標 Server。*.hbm.xml 映射檔、**實體類 (.class)**、**配置檔** 均放在 D:\testprj\classes (已在 Classpath)。| 錯誤現象 | 原因 | 解決方案 |
|---|---|---|
ClassNotFound: net.sf.hibernate... | JAR 未在啟動腳本 Classpath | 檢查 startWebLogic.cmd CLASSPATH 單行完整性、JAR 檔名拼寫 |
NoClassDefFoundError: org/dom4j/DocumentException | Dom4j 版本衝突 (WebLogic 內建舊版) | 啟動腳本 Classpath 將 Hibernate lib **前置** 於 WebLogic 系統 classpath |
TransactionManager lookup failed | 未配置 JTA TransactionManager 查找 | 添加 hibernate.transaction.manager_lookup_class=net.sf.hibernate.transaction.WebLogicTransactionManagerLookup |
| SessionFactory 未綁定 JNDI | WebLogic JNDI 不支援 Referenceable | 使用啟動類手動 cfg.buildSessionFactory() 並 ctx.rebind() |
| 映射檔找不到 | 映射檔不在 Classpath 或路徑錯誤 | 確認 *.hbm.xml 在 classes 根目錄或包路徑下,配置 cfg.addResource("path/Entity.hbm.xml") |