WebLogic 8.1 作為當時主流 J2EE 容器,與 Hibernate 3.0 整合涉及類載入隔離、事務管理、資源適配器等容器級服務。本文分兩階段說明:標準部署步驟與進階容器服務整合,附完整配置細節與避坑指南。
hibernate/lib/antlr-2.7.5H3.jar 加入 PRE_CLASSPATHhibernate.cfg.xml 設定 query.factory_class=org.hibernate.hql.classic.ClassicQueryTranslatorFactory (使用 2.x 查詢工廠)
jdbc/MyDataSource)APP-INF/lib/ (EAR 層級),不可 放在 WEB-INF/lib/ (WAR 層級) 或 Server Classpath。包含:hibernate3.jar + 依賴第三方庫 (參考 Hibernate 文檔表 3-1)APP-INF/lib/.hbm.xml 映射檔 + hibernate.cfg.xml (含 hibernate.connection.datasource = JNDI 名稱)HibernateUtil 工具類 (單例 SessionFactory)
問題:hibernate.cfg.xml 設定 session_factory_name 應自動綁定 JNDI,但 WebLogic JNDI 實作與 Hibernate 協作不佳,Context.lookup() 常回傳非序列化 Stub 導致 ClassCastException。
折衷方案:在 HibernateUtil 增加靜態存取器:
public class HibernateUtil {
private static final SessionFactory sessionFactory = buildSessionFactory();
public static SessionFactory getSessionFactory() { return sessionFactory; }
// 啟動 Servlet/WebLogic Startup Class 中主動綁定 (可選)
// ctx.bind("hibernate/SessionFactory", sessionFactory);
}
應用代碼統一呼叫 HibernateUtil.getSessionFactory(),繞過 JNDI 查找。
hibernate.cfg.xml 關鍵配置:
<property name="transaction.factory_class">org.hibernate.transaction.JTATransactionFactory</property>
<property name="transaction.manager_lookup_class">org.hibernate.transaction.WeblogicTransactionManagerLookup</property>
CMTTransactionFactory 更通用WeblogicTransactionManagerLookup:讓 Hibernate 透過 WebLogic 專有方式取得 TransactionManager,無需直接使用 Hibernate Transaction API@TransactionAttribute 或 ejb-jar.xml 宣告交易屬性,容器自動攔截.rar (Resource Archive) 部署為 Resource Adapterra.xml (而非分散在各模組 hibernate.cfg.xml)MBean 實作 (org.hibernate.jmx.HibernateService)| 項目 | 正確配置 | 常見錯誤 |
|---|---|---|
| Antlr 版本 | PRE_CLASSPATH 優先載入 2.7.5H3 | Server Classpath 載入舊版導致 HQL 解析錯誤 |
| Hibernate JAR 位置 | EAR APP-INF/lib/ | 放在 WAR WEB-INF/lib/ 導致 ClassCastException (不同 ClassLoader) |
| DataSource 參考 | hibernate.connection.datasource=jdbc/MyDataSource | 直接配置 JDBC URL/密碼,繞過容器連線池 |
| 交易策略 | JTATransactionFactory + WeblogicTransactionManagerLookup | 使用 JDBCTransactionFactory 導致交易邊界與容器不同步 |
| SessionFactory 存取 | HibernateUtil 單例存取器 | 嘗試 JNDI 查找失敗 |
MyApp.ear
├── APP-INF/lib/
│ ├── hibernate3.jar
│ ├── antlr-2.7.5H3.jar
│ ├── commons-collections.jar
│ ├── dom4j.jar
│ ├── javassist.jar
│ ├── DomainModel.jar (含 .hbm.xml)
│ └── ...
├── DomainEJB.jar
│ └── Session Beans
├── WebModule.war
│ └── Controllers / Web Services
└── META-INF/
├── application.xml
└── weblogic-application.xml
本指南基於 WebLogic 8.1 SP4+ / Hibernate 3.0.5 / PointBase 5.1 環境驗證。完整可運行範例應用 (含 Schema、映射檔、配置檔) 可從文末下載。