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

EJB 3.0 規範深度解析:註解驅動、持久化革新與未來展望

     編輯:Java 相關知識

EJB 3.0 公開草案標誌著企業級 Java 開發範式的根本轉向:從 XML 部署描述符 + 多介面儀式化代碼,轉向 **註解驅動的 POJO 程式模型**,並引入 Hibernate 風格的 O/R 映射。本文系統梳理規範核心變更、編程模型對比、持久化新架構、EJB QL 增強、部署模式演進,並給出作者獨到見解。

歷史包袱與變革動因

EJB 2.x 被詬病為 J2EE 中最複雜、生產力最低的組件:

  • Home/Remote/Local 介面 + 實現類 + ejb-jar.xml + 廠商描述符 = 爆炸性樣板代碼
  • 實體 Bean 抽象持久化模式複雜,O/R 映射廠商鎖定嚴重
  • 檢查型異常 (CreateException/FinderException) 污染業務邏輯

EJB 3.0 目標:**極簡開發、約定優於配置、POJO 化、標準化 O/R 映射**。

兩大技術支柱

1. Java 5 註解 (JSR 175)

  • 自定義註解標記類/方法/字段,不影響語義,編譯期/運行期工具解析生成部署描述符或強制運行時行為
  • 保留策略 RetentionPolicy.RUNTIME 使註解進入 class 文件,便於容器/工具掃描
  • 配合異常配置:所有註解提供明確默認值,常規信息自動推斷,僅在偏離默認時顯式聲明

2. Hibernate 靈感的 O/R 映射

  • 開源 ORM 事實標準,HQL 查詢語言直接影響新 EJB QL
  • 簡化持久化操作:查詢、更新、連接池、事務、關聯處理極簡 API
  • EJB 3.0 實體 Bean 即註解 POJO,經 EntityManager 管理成為持久化實體

四大 Bean 類型新舊對比

無狀態會話 Bean (SLSB)

// EJB 3.0:單類搞定
@Stateless @Remote
public class HelloWorldBean {
    public String sayHello() { return "Hello World!!!"; }
}

無 Home 介面,業務介面可選 (public 方法自動暴露),@Remote 聲明遠程介面,默認 Local。

有狀態會話 Bean (SFSB)

  • 初始化方法建議暴露於業務介面,客戶端調用 (關於 @Init 註解仍在討論)
  • @Remove 標記移除實例的方法,異常情況下是否移除仍在討論 (作者建議:異常不移除,會話結束由容器清理)

消息驅動 Bean (MDB)

  • 唯一**必須**實現業務介面的 Bean (如 javax.jms.MessageListener)
  • 介面標識支持的消息系統類型

實體 Bean:從抽象 Schema 到註解 POJO

  • @Entity 標記實體類,非持久字段用 @Transient (作者建議改用 @Persistent 正向聲明)
  • 屬性訪問:JavaBean 風格 getter/setter 或 public/protected 字段
  • 助手類:封裝狀態,無持久化標識,緊耦合實體實例,非共享訪問
  • 持久化上下文與事務上下文鬆耦合,隱含共存

關聯映射與 O/R 映射革新

關聯類型全支持

  • 單向/雙向、一對一/一對多/多對一/多對多
  • 雙向關聯分擁有端 (負責更新外鍵) 和逆向端 (@Inverse 標記)
  • 多對多必須顯式聲明擁有端

O/R 映射註解化

  • 從 abstract-persistence-schema 轉為 Hibernate 風格類級/字級註解
  • 支持具體表/列映射:@Table(name="CUST"), @Column(name="NAME", columnDefinition="VARCHAR(50) NOT NULL")
  • 內建 SQL 片段支持:columnDefinition="BLOB NOT NULL"
  • 主鍵生成策略標準化 (自增、序列、UUID 等),解決 EJB 2.1 需自行設計模式的痛點

EJB QL 全面升級:接近標準 SQL

  • @NamedQuery 定義靜態查詢,EntityManager.createNamedQuery() 執行
  • 動態查詢:createQuery(ejbql), createNativeQuery(sql)
  • 增強特性:
      li>批量 UPDATE/DELETE
    • 原生 INNER/OUTER JOIN,FETCH JOIN 預加載關聯,ORDER BY
    • 多值返回:SELECT new CustomerDTO(c.id, c.status, o.count) ...
    • GROUP BY / HAVING
    • WHERE 子查詢嵌套
    • 直接支持原生 SQL
@NamedQuery(name="findBigCustomers",
  queryString="SELECT c FROM Customer c JOIN c.orders o WHERE o.count > 100")
...
customers = em.createNamedQuery("findBigCustomers")
              .setParameter("custName", "Smith")
              .listResults();

客戶端模型與依賴注入

  • @Inject 註入業務介面引用 (容器環境)
  • @Resource(name="myDS") 注入資源 (DataSource 等),類型自動推斷
  • 普通 Java 客戶端 (非容器) 如何獲取 Bean 仍未明確 (作者呼籲規範補充)

異常處理簡化

  • 拋出任意應用異常,無需聲明檢查型異常
  • 容器包裝系統異常為 javax.ejb.EJBException (RuntimeException)
  • 僅在必要時拋出 IllegalArgumentException/IllegalStateException

部署模式演進展望

作者預測兩種可能:

  1. 轉換模式:EJB 3.0 源文件 → 生成 EJB 2.1 風格描述符/介面 → 現有容器部署流程 (兼容性好)
  2. JSP 風格熱部署:拷貝 .ejb 文件到熱部署目錄 → 容器識別/編譯/部署/可用 (支援迭代開發)

部署模式圖

作者觀點與呼籲

  1. Home 介面應徹底廢除
  2. 實體 Bean 定位為數據庫映射,簡化正確;但遺留 EIS 映射擴展性被犧牲
  3. 反對在註解中內嵌 SQL 片段 (如 columnDefinition):導致代碼與特定數據庫方言緊耦合,違背可移植性初衷
  4. 原生 SQL 支持雖誘人,規範應規範使用場景,防止濫用
  5. @Table 運行時表名必須對應實際表,規範應明確契約
  6. 客戶端編程模型 (特別是非容器客戶端) 需詳細規範,並說明向後兼容
  7. @Transient 與 Java 關鍵字衝突,建議改用 @Persistent 正向聲明

相關 JSR 協調

  • JSR 175 (Metadata) 已定型,衝突小
  • JSR 181 (Web Services Metadata) 兩點協調:
    • Web Service 介面映射機制統一
    • 安全模型:EJB @MethodPermissions vs JSR 181 @SecurityRoles/@SecurityIdentity,最終由 J2EE 1.5 層統一

結語

EJB 3.0 正朝正確方向邁進:簡化極致、註解驅動、標準化 ORM。但 O/R 映射細節、SQL 耦合風險、客戶端模型仍待打磨。**開發者應積極參與 JCP 反饋 (ejb3-feedback@sun.com),推動規範走向成熟可用。**

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