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

基於 EJB 3.0 JPA 設計企業級應用:PetStore 案例深度解析

     編輯:Java 相關知識

Java EE 5 引入 EJB 3.0 與 Java Persistence API (JPA),提供標準化 ORM 解決方案,擺脫 Hibernate 等第三方框架鎖定。本文以 PetStore 應用為例,深入剖析容器內應用設計:分層架構、領域模型、ORM 映射策略、測試方法論與遠端化擴充。

架構概覽:三層設計

  • 呈現層:Struts 框架 (非本文焦點)。
  • 服務層:PetStoreService Stateless Session Bean,扮演 Service Facade,將工作委派給 DAO 協作者。
  • 資料存取層:粗粒度 DAO (AccountDao、OrderDao、ProductDao) 實現為 Stateless Session Bean,注入 EntityManager 執行持久化操作。

領域模型 (EJB 3.0 Entity Bean) 於層間傳遞,離開 DAO 層時脫離 (detached),重新進入需 merge 重新關聯。全域運行於同一 JVM,免除分散式部署複雜度。

服務層:Facade 與依賴注入

協作者注入兩種方式:

@EJB(beanName="AccountDao") AccountDao accountDao; // 欄位注入
// 或
@PostConstruct
public void init() { messageSource = new MessageSourceImpl("exceptions"); } // 生命週期回呼

測試策略核心:驗證與協作者的交互,採用 EasyMock 動態 Mock。

資料存取層:EntityManager 與 EJB QL

@PersistenceContext(unitName="manager1") protected EntityManager em;

// 查詢範例
profile = (UserProfile) em.createQuery(
    "from UserProfile up where up.login = :login")
    .setParameter("login", login).getSingleResult();

// 持久化
em.persist(account);

此層為持久化感知類別最密集區,需容器內測試策略。

領域模型:JPA 實體限制與設計原則

  • 識別碼:@Id @GeneratedValue(strategy=SEQUENCE, generator="AccountSeq") @Column(name="account_sysid") 對應主鍵。
  • 樂觀鎖版本欄位:@Version @Column(name="row_version")。
  • 映射註解分散:若採註解方式,ORM 中繼資料散落程式碼中。

脫離/附著狀態陷阱

預設 Lazy Loading 下,實體在 EntityManager 內 product.getItems().size() > 0,但脫離後 (呈現層) 同樣程式碼回傳 0。無法單純由物件狀態判斷載入狀態,必須建立專案慣例與規約 (如明確標記需預先載入的關聯)。

領域模型業務方法須在任何層均可安全呼叫,故將業務方法數量壓縮至必要最小集,保留 POJO 特性以利 POJT 測試。

ORM 映射策略:註解 vs XML 映射檔

維度註解 (Metadata)XML 映射檔
適用專案小型、少表 (<100)、無專職映射角色中大型、專職映射團隊
優點開發快、程式碼集中關注點分離、降低資源爭用、彈性高
缺點模型與映射耦合、測試技術分離維護成本高

PetStore 採註解節省時間。資料庫遷移 (商用 DB → PostgreSQL) 無需改映射 (雙方支援 Sequence),但主鍵生成策略區域通常需重寫。全面測試覆蓋關聯映射、抓取行為、級聯持久化至關重要,可利用 JPA 容器外模式執行。

分層測試策略

  • 服務層:EasyMock Mock 協作者,驗證交互。
  • DAO 層:強資料庫內聚,需容器內測試。JBoss Embeddable EJB3 容器 (單元測試啟動、同 JVM) 最適合,啟動 ~30 秒可優化。
  • 領域模型業務方法:POJT 即可。
  • ORM 映射層:窮盡測試關聯/級聯/抓取,利用 JPA 容器外功能 (無容器啟動開銷)。

測試重點:及早發現抓取類型或級聯類型變更帶來的負面影響。

遠端化擴充:Remote Facade 模式

本地設計 (同 JVM) 優勢多。若需遠端,新增 Remote Facade (Remote Stateless Session Bean):

  1. 轉換領域模型 ⇄ DTO (Data Transfer Object)。
  2. 委派 Service Facade 執行業務邏輯。
代價:額外 DTO 層與轉換邏輯,換取乾淨遠端介面與鬆耦合。

EJB 3.0/JPA 競爭優勢與未解議題

  • 解決 Spring 興起痛點:零配置檔、開發體驗優於 Spring。
  • JPA 標準化 ORM 並整合容器服務 (交易/安全),前輩框架 (Hibernate/JDO) 將轉向實作 JPA Provider。

未解議題 (Proposed Final Draft 階段):

  1. 缺唯讀實體 Bean 定義 (EJB 2.1/Spring 支援)。
  2. 可插拔持久化提供者尚未交付。
  3. 標準 OptimisticLockException 剛納入,暫仍依賴 Provider 專屬例外 (如 Hibernate StaleObjectStateException)。
  4. Java EE 整體痛點在 Web/EJB 容器整合 (Spring/Seam/Resin 各有對策),期待 EE 5.1 標準化 DI。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved