EJB 3.0 公開草案標誌著企業級 Java 開發範式的根本轉向:從 XML 部署描述符 + 多介面儀式化代碼,轉向 **註解驅動的 POJO 程式模型**,並引入 Hibernate 風格的 O/R 映射。本文系統梳理規範核心變更、編程模型對比、持久化新架構、EJB QL 增強、部署模式演進,並給出作者獨到見解。
EJB 2.x 被詬病為 J2EE 中最複雜、生產力最低的組件:
EJB 3.0 目標:**極簡開發、約定優於配置、POJO 化、標準化 O/R 映射**。
RetentionPolicy.RUNTIME 使註解進入 class 文件,便於容器/工具掃描// EJB 3.0:單類搞定
@Stateless @Remote
public class HelloWorldBean {
public String sayHello() { return "Hello World!!!"; }
}
無 Home 介面,業務介面可選 (public 方法自動暴露),@Remote 聲明遠程介面,默認 Local。
@Remove 標記移除實例的方法,異常情況下是否移除仍在討論 (作者建議:異常不移除,會話結束由容器清理)javax.jms.MessageListener)@Entity 標記實體類,非持久字段用 @Transient (作者建議改用 @Persistent 正向聲明)@Inverse 標記)abstract-persistence-schema 轉為 Hibernate 風格類級/字級註解@Table(name="CUST"), @Column(name="NAME", columnDefinition="VARCHAR(50) NOT NULL")columnDefinition="BLOB NOT NULL"@NamedQuery 定義靜態查詢,EntityManager.createNamedQuery() 執行createQuery(ejbql), createNativeQuery(sql)SELECT new CustomerDTO(c.id, c.status, o.count) ...@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 等),類型自動推斷javax.ejb.EJBException (RuntimeException)IllegalArgumentException/IllegalStateException作者預測兩種可能:

columnDefinition):導致代碼與特定數據庫方言緊耦合,違背可移植性初衷@Table 運行時表名必須對應實際表,規範應明確契約@Transient 與 Java 關鍵字衝突,建議改用 @Persistent 正向聲明@MethodPermissions vs JSR 181 @SecurityRoles/@SecurityIdentity,最終由 J2EE 1.5 層統一EJB 3.0 正朝正確方向邁進:簡化極致、註解驅動、標準化 ORM。但 O/R 映射細節、SQL 耦合風險、客戶端模型仍待打磨。**開發者應積極參與 JCP 反饋 (ejb3-feedback@sun.com),推動規範走向成熟可用。**