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

Hibernate 3 學習筆記(十二):Component 組合映射 - 將值型別封裝為物件

     編輯:Java 相關知識

什麼是 Component?

**Component(組合/嵌入式值型別)**:擁有者生命週期完全綁定的值型別物件,**無獨立主鍵、無獨立資料表**,資料扁平化儲存在擁有者的資料表中。相當於「將多個欄位組合成一個有意義的領域物件」。

場景:將 email 字段升級為 MailAddress 物件

資料表不變

CREATE TABLE user (
    id PK, name, age, email VARCHAR(100) NOT NULL
);

領域模型

public class MailAddress {
    private String email;
    public void sendMail() { System.out.println("Send mail to " + email); }
    // getter/setter ...
}

public class User {
    private Integer id;
    private String name;
    private Integer age;
    private MailAddress mailAddress; // Component
    // getter/setter ...
}

映射檔:<component>

<class name="com.hb3.pack_05.model.User" table="user">
    <id name="id" .../>
    <property name="name"/>
    <property name="age"/>
    <component name="mailAddress" class="com.hb3.pack_05.model.MailAddress">
        <property name="email" column="email" type="string" not-null="true"/>
    </component>
</class>
  • name="mailAddress":User 中的屬性名。
  • class:Component 實際類別。
  • 內部 <property> 映射到同一張表的欄位。

操作示範

MailAddress addr = new MailAddress();
addr.setEmail("bluelazysb@hotmail.com");

User user = new User();
user.setName("shenbin");
user.setAge(28);
user.setMailAddress(addr);

session.save(user); // 單一 INSERT,email 欄位同步寫入

// 載入後可直接呼叫領域方法
user = (User) session.load(User.class, 1);
user.getMailAddress().sendMail(); // 輸出: Send mail to bluelazysb@hotmail.com

Component 關鍵特性

Component vs Entity 對照

特性說明
生命週期綁定User 刪除 → MailAddress 自動刪除;無獨立儲存/刪除
無主鍵不需實作 equals/hashCode(除非放入 Set)
支援巢狀Component 內可再包含 Component
支援集合<set> + <composite-element> 可建立 Component 集合
可為 null若所有欄位皆 null,Hibernate 將整個 Component 視為 null
維度Entity (一對一)Component
資料表獨立表同表扁平化
主鍵有無
共享引用可被多 Entity 參考僅屬於單一擁有者
獨立載入可不可
適用場景獨立業務實體值物件、領域概念封裝

設計建議

**優先使用 Component 進行領域建模**(如 Address、Money、Name、DateRange 等值物件),只有當物件需要獨立身分、被多方引用、或有獨立生命週期時,才升級為 Entity。這符合 DDD「值物件優先」原則,也能獲得更佳效能(少 JOIN、少快取管理)。

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