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

WebLogic 8.1 上配置 Hibernate 3.0 完整指南

     編輯:Java 相關知識

從基礎部署到 JNDI/JTA/JCA/JMX 進階整合:Hibernate 3.0 on WebLogic 8.1

WebLogic 8.1 作為當時主流 J2EE 容器,與 Hibernate 3.0 整合涉及類載入隔離、事務管理、資源適配器等容器級服務。本文分兩階段說明:標準部署步驟與進階容器服務整合,附完整配置細節與避坑指南。

第一階段:標準部署 7 步驟

  1. 建立域:建立 WebLogic Workshop (WLW) 域 (支援 Workshop 開發)
  2. 解決 Antlr 衝突:
    方案 A:將 hibernate/lib/antlr-2.7.5H3.jar 加入 PRE_CLASSPATH
    方案 B:hibernate.cfg.xml 設定 query.factory_class=org.hibernate.hql.classic.ClassicQueryTranslatorFactory (使用 2.x 查詢工廠)
  3. 配置資料源:使用 WLW 內建 PointBase 實例,建立新用戶/Schema 並匯入測試資料
  4. 建立連線池與 DataSource:Console 中配置 JDBC Connection Pool → DataSource,記錄 JNDI 名稱 (如 jdbc/MyDataSource)
  5. 建立應用模組:使用 WLW 建立
  6. 庫檔放置關鍵:所有 Hibernate 相關 JAR 必須放在 APP-INF/lib/ (EAR 層級),不可 放在 WEB-INF/lib/ (WAR 層級) 或 Server Classpath。包含:hibernate3.jar + 依賴第三方庫 (參考 Hibernate 文檔表 3-1)
  7. 開發領域模型與配置:
    • Java 專案編寫領域類 → 編譯輸出 JAR 放入 APP-INF/lib/
    • 編寫 .hbm.xml 映射檔 + hibernate.cfg.xml (含 hibernate.connection.datasource = JNDI 名稱)
    • 複製 HibernateUtil 工具類 (單例 SessionFactory)
  8. EJB 模組:建立 Session Bean 操作領域模型
  9. Web/Web Service 模組:測試 Session Bean 互操作性

第二階段:進階容器服務整合

1. JNDI 整合: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 查找。

2. JTA 整合:容器管理交易 (CMT) 最佳實踐

hibernate.cfg.xml 關鍵配置:

<property name="transaction.factory_class">org.hibernate.transaction.JTATransactionFactory</property>
<property name="transaction.manager_lookup_class">org.hibernate.transaction.WeblogicTransactionManagerLookup</property>
  • JTATransactionFactory:同時支援 BMT (Bean Managed) 與 CMT (Container Managed),比 CMTTransactionFactory 更通用
  • WeblogicTransactionManagerLookup:讓 Hibernate 透過 WebLogic 專有方式取得 TransactionManager,無需直接使用 Hibernate Transaction API
  • EJB 以 @TransactionAttribute 或 ejb-jar.xml 宣告交易屬性,容器自動攔截

3. JCA 整合:資源適配器架構 (實驗性)

  • 願景:Hibernate 打包為 .rar (Resource Archive) 部署為 Resource Adapter
  • 優勢:
    • 多應用共享單一 Hibernate 適配器 (降低耦合)
    • 所有配置集中在 ra.xml (而非分散在各模組 hibernate.cfg.xml)
    • 支援熱部署/熱替換持久化實作 (對應未來 EJB 3.0 / JDO 標準化)
  • 現狀:Hibernate JCA 支援仍屬實驗階段,WebLogic 8.1 未充分驗證,生產環境不建議採用

4. JMX 整合:管理與監控 (未驗證)

  • Hibernate 內建 MBean 實作 (org.hibernate.jmx.HibernateService)
  • 潛在價值:
    • 部署/重部署生命週期管理
    • 運行時統計監控:Session 開關數、查詢執行時間、二級快取命中率、連線池狀態
  • 缺口:WebLogic MBean Server 與 Hibernate MBean 註冊機制整合文檔缺乏,實作路徑不明

配置檢查清單

項目正確配置常見錯誤
Antlr 版本PRE_CLASSPATH 優先載入 2.7.5H3Server 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、映射檔、配置檔) 可從文末下載。

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