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

EJB 設計模式(四):Value Object 複製優化

     編輯:Java 相關知識

背景

承接模式三,Entity Bean 繼承 Value Object (Struct),但 getData()/setData() 仍需手動逐欄位複製。模式四在 Struct 新增 copyFrom(),實現一鍵複製。

Value Object 定義

public class CompanyStruct implements Serializable {
    public Integer comId;
    public String comName;
    public String comDescription;
    public Timestamp mutationDate;

    // 新增:從另一 Struct 複製所有欄位
    public void copyFrom(CompanyStruct struct) {
        this.comId = struct.comId;
        this.comName = struct.comName;
        this.comDescription = struct.comDescription;
        this.mutationDate = struct.mutationDate;
    }
}

Entity Bean 簡化實作

public class CompanyBean extends CompanyStruct implements EntityBean {
    // getData():建立新 Struct,複製 this (Entity Bean 本身即 Struct)
    public CompanyStruct getData() {
        CompanyStruct result = new CompanyStruct();
        result.copyFrom(this); // this 可視為 CompanyStruct
        return result;
    }

    // setData():從參數 Struct 複製到 this
    public void setData(CompanyStruct struct) {
        this.copyFrom(struct);
    }

    // ejbCreate 同樣簡化
    public Integer ejbCreate(CompanyStruct struct) throws CreateException {
        this.comId = struct.comId; // 設定 PK
        setData(struct);           // 複製其餘欄位
        return null;
    }
}

關鍵點分析

議題說明
this 傳遞爭議EJB 規範不建議傳遞 this 參考(可能跨執行緒存取同一 Bean 實例導致交易衝突)。但此處 copyFrom 僅讀取欄位值,不涉及任何容器管理方法,故安全。
程式碼縮減原需 4 次指派 → 1 行 copyFrom。欄位增減只需修改 Struct,Bean 完全不用動。
部署描述符同步CMP 欄位變更仍需更新 ejb-jar.xml,但 Java 程式碼已解耦。

優缺點總結

  • ✅ 程式碼極度精簡,可讀性與維護性大幅提升。
  • ✅ 資料庫結構變更僅修改 Struct,Bean 程式碼不變。
  • ✅ 適用於大量欄位的 Entity Bean。
  • ❌ 尚未解決 Bean 之間關聯關係(關聯將在模式五處理)。
  • ❌ 繼承結構導致 Entity Bean 暴露所有欄位為 public,違反封裝(可改用組合而非繼承)。

現代視角:JPA/Hibernate 替代

現代專案棄用 EJB 2.x CMP,改用 JPA @Entity + @Embeddable Value Object:

@Entity
public class Company {
    @Id Integer comId;
    @Embedded CompanyDetails details; // Value Object
}

@Embeddable
public class CompanyDetails {
    String comName;
    String comDescription;
    Timestamp mutationDate;
    // 無需 copyFrom,JPA 自動管理生命週期
}

結語

模式四展示「以 Value Object 為中心,透過複製方法消除重複指派」的實用技巧。雖 EJB 2.x 已成歷史,但「DTO 複製工具」(如 BeanUtils.copyProperties、MapStruct、Lombok @Builder)在現代開發中依然普遍應用,核心思想一脈相承。

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