Entity Bean 定位
在成熟多層架構中,組件分為兩類:
- 應用邏輯組件:Session Bean,提供業務方法。
- 持久資料組件:Entity Bean,代表資料庫資料,生命週期長、可恢復、多客戶共享。
實作 javax.ejb.EntityBean,由容器管理生命週期、並發、持久化。
構成檔案
- Entity Bean 類別:對應資料表,含業務邏輯與持久化回調。
- Remote Interface:客戶端呼叫的業務方法簽名(EJBObject 代理)。
- Home Interface:建立/查找/移除 EJBObject 的工廠方法。
- Primary Key 類別:唯一標識,可為單欄位或複合鍵,須實作
equals/hashCode。
- Deployment Descriptor (ejb-jar.xml):容器配置屬性(交易、安全、持久化策略)。
- Environment Entries:部署時可配置的參數。
核心特徵
- 長生命週期:超越客戶端會話,伺服器重啟仍存在。
- 恢復性:容器故障後自動恢復狀態。
- 共享實例:多客戶同時存取同一實體,容器負責同步/鎖定。
- 鈍化/活化:
ejbPassivate() 釋放資源+ejbStore() 存盤;ejbActivate()+ejbLoad() 還原。
容器管理持久化 (CMP) vs Bean 管理持久化 (BMP)
| 維度 | CMP | BMP |
| SQL 撰寫 | 容器依描述符自動生成 | Bean 開發者手寫 JDBC |
| 資料庫移植性 | 高(描述符調整) | 低(SQL 綁定特定方言) |
| 複雜查詢/優化 | 受限於容器能力 | 完全掌控 |
| 開發效率 | 高(專注業務) | 低(大量樣板碼) |
關鍵回調方法(EntityBean 介面)
public interface EntityBean extends EnterpriseBean {
void setEntityContext(EntityContext ctx);
void unsetEntityContext();
void ejbRemove(); // 刪除實體資料
void ejbActivate(); // 活化:載入狀態
void ejbPassivate(); // 鈍化:存儲狀態+釋放資源
void ejbLoad(); // 從資料庫載入狀態
void ejbStore(); // 寫入資料庫
}
ejbStore/Load 由容器在交易邊界/鈍化活化時自動調用(CMP 容器實作,BMP 開發者實作)。
ejbCreate 可選、可多載,對應 Home 介面 create;ejbPostCreate 完成關聯設定。
ejbFindByPrimaryKey 強制實作,回傳 Primary Key;其他 ejbFindXXX 可回傳 Enumeration/Collection。
EntityContext 介面
public interface EntityContext extends EJBContext {
EJBObject getEJBObject(); // 取得遠端代理
Object getPrimaryKey(); // 取得主鍵
}
繼承 EJBContext 提供:getCallerIdentity(), isCallerInRole(), getUserTransaction() (BMT 專用), setRollbackOnly() 等。
持久化狀態管理兩種方式
- Bean 管理:在
ejbLoad/Store 中直寫 JDBC/SQL。
- 容器管理:描述符宣告持久化欄位(
<cmp-field>),容器自動同步。
實體 Bean 可被直接修改(繞過 EJB)
資料庫層面的變更(批次作業、其他應用)不經 EJB 容器,容器需透過 ejbLoad 重新同步(隔離級別與快取策略影響一致性)。
Entity Bean (CMP) 是早期 J2EE 嘗試解決「物件-關係映射」的標準化方案,雖被 JPA/Hibernate 取代,但其生命週期模型、容器契約、主鍵/查找機制對理解現代 ORM 框架設計極有啟發。
- 上一篇文章: JDBC 實戰進階:DatabaseMetaData 動態探索未知資料庫結構
- 下一篇文章: EJB 專家進階指南(五):深入掌握 EJB Context、安全機制與物件控制代碼
Copyright ©
程式碼之家 All Rights Reserved