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

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

     編輯:J2EE

緣起:為什麼需要 EJB 3.0?

EJB 2.x 被廣泛詬病:樣板代碼多、Home/Remote 接口繁瑣、Entity Bean 複雜度高、部署描述符龐大。EJB 3.0 (JSR 220) 以「極簡開發」為目標,引入 Java 5 註解、採納 Hibernate O/R 映射模型,實現「配置即代碼」,大幅降低開發門檻。

兩大核心變革

  1. 基於註解的編程模型: 任何 POJO 加上註解即成 Enterprise Bean,部署描述符可選,Home 接口廢除,業務接口可選(容器自動生成)。
  2. 全新持久化模型: Entity Bean 變為純 POJO,透過 EntityManager 管理生命週期,支援脫管/合併,O/R 映射採用 Hibernate 風格註解,EJB QL 大幅增強接近 SQL。

深度剖析四大 Bean 類型

1. 無狀態會話 Bean (SLSB)

@Stateless
@Remote
public class HelloWorldBean {
    public String sayHello() { return "Hello World!!!"; }
}
  • 單類搞定,無需 Home、實現接口可選(@BusinessMethod 精確暴露方法)。
  • 預設生成 Local 接口,@Remote 切換為遠程。

2. 有狀態會話 Bean (SFSB)

  • 初始化方法建議暴露於業務接口,客戶端顯式調用(規範組討論中是否提供 @Init 註解)。
  • @Remove 標記銷毀方法,調用後實例移除(異常情況下移除語義仍在討論)。

3. 消息驅動 Bean (MDB)

  • 必須實現 javax.jms.MessageListener(或其他消息系統接口),此接口非傳統業務接口,僅標識消息類型。

4. 實體 Bean (Entity Bean) — 核心重寫

@Entity
@Table(name="CUSTOMER")
public class Customer {
    @Id @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;
    private String name;
    // getter/setter 或 public/protected 字段均可
}
  • @Entity 標記持久化實體,字段預設持久化,@Transient 排除。
  • 助手類(Embeddable)可封裝狀態,但無持久化標識,緊密綁定主實體。
  • 關係映射:@OneToOne/@OneToMany/@ManyToOne/@ManyToMany,雙向關係需指定 mappedBy(inverse side)。

O/R 映射與 EJB QL 增強

靈活的映射註解

@Column(name="DATA", columnDefinition="BLOB NOT NULL")
private byte[] data;

支援 columnDefinition 直接寫 SQL 片段,但作者建議謹慎使用,避免代碼與特定 SQL 方言緊耦合。

EJB QL 3.0 新特性

  • 批量更新/刪除:DELETE FROM Customer c WHERE c.status = 'inactive'
  • 連接查詢:JOIN/LEFT JOIN/FETCH JOIN
  • 投影構造函數:SELECT new CustomerDTO(c.id, c.name) FROM Customer c
  • GROUP BY/HAVING、子查詢、原生 SQL (createNativeQuery)
  • 命名查詢:@NamedQuery(name="findByName", queryString="SELECT c FROM Customer c WHERE c.name LIKE :name")

依賴注入與資源管理

@Resource(name="myDataSource")
private DataSource customerDB;  // 類型從字段推斷

@PersistenceContext
private EntityManager em;       // 注入持久化上下文

@EJB
private PaymentService payment; // 注入 Session Bean
  • 容器根據註解自動初始化資源,部署人員需在容器預先配置 JNDI 名稱。
  • @Inject (JSR 299 前身) 簡化注入,但普通 Java 客戶端如何獲取上下文仍在規範討論中。

異常處理簡化

  • 廢除 CreateException/FinderException 等受檢異常。
  • 應用異常可自由定義;系統異常包裝為 EJBException(非受檢)。

部署模式展望

  1. 預生成模式: 容器啟動時將註解轉為傳統描述符+接口,兼容 EJB 2.x 容器邏輯。
  2. 熱部署/掃描模式: 類似 JSP,將 EJB 類放入指定目錄,容器動態識別部署,支援快速迭代。

作者觀點與建議

  • 贊成: Home 接口應徹底廢除;實體 Bean 專注關係型數據庫映射,簡化模型;@Persistent 替代 @Transient 明確標記持久化字段。
  • 保留: columnDefinition 等 SQL 片段耦合度過高;原生 SQL 支援應規範用法,避免硬編碼;客戶端編程模型(特別是非受管客戶端)急需明確規範;@Table 執行時表名驗證機制需標準化。

相關 JSR 協同

  • JSR 175 (Metadata) 已定型,無衝突。
  • JSR 181 (Web Services Metadata) 在安全註解(@SecurityRoles vs @MethodPermissions)、@RunAs 定義上有差異,最終將在 J2EE 5 層面統一。

結語

EJB 3.0 朝著「簡單、標準、POJO 化」邁出關鍵一步。O/R 映射模型仍在完善中,期望不與 SQL 過度耦合。開發者應積極向 ejb3-feedback@sun.com 提交建議,推動規範走向成熟。

原文作者:Itzealot(技術博客轉載)

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