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

EJB 2.0 容器管理關係(CMR)完整指南:二十一世紀的實體 Bean 關聯建模

     編輯:J2EE

前言:從 EJB 1.x 到 2.0 的關聯建模演進

企業應用常涉及複雜業務關係。EJB 1.x 時代,開發者需在 ejbCreate()、ejbActivate()、ejbPassivate() 手寫持久化邏輯,或改用 BMP。EJB 2.0 引入 Container-Managed Relationships (CMR),由容器自動管理實體 Bean 間的持久化、載入與關聯完整性,極大簡化開發。

一、CMP 2.0 核心變革

  • 欄位不再用屬性標識,改用 抽象 Getter/Setter 定義 CMP 與 CMR 欄位。
  • 關聯方向與多重性決定回傳類型:單一實例回傳 Local Interface;多重實例回傳 java.util.Collection 或 Set。
  • 關係定義於部署描述檔 <relationships> 標籤中,容器據此管理關聯。

二、部署描述檔關鍵標籤解析

<ejb-relation>
  <ejb-relation-name>User-Demographics</ejb-relation-name>
  <ejb-relationship-role> ... <multiplicity>One</multiplicity> ... <cmr-field><cmr-field-name>demographics</cmr-field-name></cmr-field> </ejb-relationship-role>
  <ejb-relationship-role> ... <multiplicity>One</multiplicity> ... <cascade-delete/> ... </ejb-relationship-role>
</ejb-relation>

關鍵標籤:multiplicity(One/Many)、cmr-field(關聯欄位名)、cascade-delete(級聯刪除,標記於子 Bean 端)。

三、八種關係類型與建模範例

類型說明經典範例
一對一單向父參考單一子實體客戶-地址
一對一雙向雙向參考客戶-信用卡
一對多單向父參考多子,子無需回參父客戶-電話號碼
一對多雙向雙向參考,父擁有多子客戶-訂單
多對一單向多父參考單一子機票訂位-航班
多對多單向多父參考多子,無需反查訂位-多航段
多對多雙向雙向多對多活動-地點

註:多對一雙向實質等同一對多雙向。

四、Local Interface 限制與優勢

CMR 強制使用 Local Interface,限制關係必須在同一 JVM 內,無法跨分散式實體 Bean。但呼叫無遠端開銷,效能極高,如同本地 Java 方法呼叫。

五、程式碼實作範例演示

5.1 一對一單向:Customer - Address

// CustomerBean
public abstract class CustomerBean implements EntityBean {
    public abstract String getCustomerName(); // PK
    public abstract AddressLocal getAddress(); // CMR 欄位
    public abstract void setAddress(AddressLocal addr);
}
// AddressBean(無 CMR 欄位)
public abstract class AddressBean implements EntityBean {
    public abstract String getAddress(); // PK
}

部署描述檔設定 multiplicity 均為 One,Customer 端含 cmr-field,Address 端含 cascade-delete。

5.2 一對一雙向:新增 Address 端 CMR 欄位

// AddressBean 新增
public abstract CustomerLocal getCustomer();
public abstract void setCustomer(CustomerLocal customer);

部署描述檔 Address 端加入 cmr-field customer,即可雙向導航。

5.3 一對多:Customer - Phone(Collection 回傳)

// CustomerBean
public abstract Collection getPhones();
public abstract void setPhones(Collection phones);

部署描述檔 Customer 端 multiplicity = One,Phone 端 = Many,含 cascade-delete。雙向需 Phone 端加 getCustomer()/setCustomer() 與對應 cmr-field。

5.4 多對多:Customer - Webpage(雙向 Collection)

// CustomerBean
public abstract Collection getWebPages();
public abstract void setWebPages(Collection pages);
// WebpageBean
public abstract Collection getCustomers();
public abstract void setCustomers(Collection customers);

部署描述檔雙端 multiplicity = Many,**不加 cascade-delete**(否則刪一客戶會刪所有網頁)。

六、總結:CMR 的核心價值

  • 開發者無需在 Bean 實作類撰寫自訂持久化邏輯。
  • 容器保證子 Bean 正確持久化、啟動、載入。
  • 實現規格初衷:將交易與持久化邏輯從應用開發者移至容器。
  • 支援單向/雙向、一對一/一對多/多對多彈性建模。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved