| 維度 | 重量級 (EJB 2/3 Session/MDB) | 輕量級 (POJO + Spring/Hibernate) |
|---|---|---|
| 業務邏輯載體 | Session Bean (需容器) | 普通 Java 類 (POJO) |
| 資料存取 | Entity Bean (EJB 2) / JPA (EJB 3) / DAO | Hibernate/JDO/JPA/iBATIS/MyBatis |
| 企業服務 | 容器提供 (交易/安全/遠端) | AOP 提供 (Spring 交易/安全/快取) |
| 開發/測試 | 需啟動容器、部署驗證、週期長 | 單元測試可獨立運行、秒級反饋 |
| 部署複雜度 | 高 (EAR、描述檔、伺服器專屬) | 低 (JAR/WAR、Spring Boot 內嵌容器) |
EJB 3 融合 POJO 概念 (Entity Bean 即 JPA Entity),但 Session/MDB 仍綁定容器,屬混合模式。
processXxx() 方法,內含完整 SQL/邏輯。order.calculateTotal()、account.transfer()。| 模式 | 實作 | 優點 | 缺點 |
|---|---|---|---|
| EJB Session Facade | SLSB + CMT + 遠端介面 | 容器級交易/安全/叢集、粗粒度 API 減少網路呼叫 | 僅容器內測試、DTO 轉換繁瑣、部署重 |
| POJO Facade + Spring AOP | 普通類 + @Transactional/@Secured | 容器外測試、無 DTO (直接回傳領域物件)、依賴注入簡潔 | 無法參與遠端分散式交易 (需 JTA 整合) |
| 暴露領域模型 | View 直接存取領域物件 + Open Session in View / Lazy Loading | 零 Facade 代碼、極致 DRY | View 層耦合持久化細節、交易邊界難控制、N+1 查詢風險 |
| 技術 | 定位 | 優點 | 缺點 |
|---|---|---|---|
| JDBC | 底層 API | 完全控制 SQL、效能上限最高 | 樣板代碼多、映射手寫、移植性差 |
| iBATIS / MyBatis | SQL 映射 | XML 管理 SQL、映射自動、支援動態 SQL、學習曲線平 | 仍需寫 SQL、無物件關係管理 |
| Hibernate / JPA | 全功能 ORM | 物件圖持久化、延遲載入、快取、JPQL/HQL、Schema 生成 | 複雜查詢難優化、學習曲線陡、物件-關係阻抗失配 |
| JDO | 標準化 ORM | 純粹透明持久化、支援非關係資料庫 | 社群較小、工具生態弱 |
建議:核心領域用 ORM,複雜報表/批次用 MyBatis/JDBC,混合使用。
@Version 欄位 + WHERE version = ?,適合低衝突、高併發讀。ORM 內建支援。SELECT ... FOR UPDATE,適合高衝突、需強一致性。資料庫支援度不一。| 模式 | 機制 | 適用場景 |
|---|---|---|
| 離線樂觀鎖 | 首次讀取記錄版本號存 Session,提交時比對 DB 版本號 | 衝突罕見、用戶可接受重新編輯 |
| 離線悲觀鎖 | 編輯開始鎖定記錄 (應用層鎖表/標記欄位),編輯結束釋放 | 衝突頻繁、不可接受覆蓋、需強獨佔 |
長交易不可使用資料庫原生鎖 (跨請求無法持有連線),必須在應用層實作。
沒有銀彈,只有權衡。現代趨勢明確傾向 POJO + Spring 生態 + 容器化部署,但理解 EJB 設計哲學 (聲明式服務、遠端透明、容器管理) 有助於在任何框架下做出正確架構決策。