組件 映射將一個類別的屬性「內嵌」至另一個實體的資料表中,組件類別本身不擁有獨立生命週期與主鍵,僅作為屬性群組存在。Hibernate 使用 @Embeddable 標記組件類別,@Embedded (可省略) 於實體屬性上引用。
// 組件類別 C
@Embeddable
public class C {
private String cname2;
// getter/setter
}
// 組件類別 B (內含 C)
@Embeddable
public class B {
private String bname;
private C c;
// getter/setter
}
// 實體類別 A
@Entity
public class A {
@Id @GeneratedValue private int id;
private B b;
private C c; // 直接引用 C
// getter/setter
}
Hibernate 會以「屬性路徑」作為欄位名:
b.bname → b_bnameb.c.cname2 → b_c_cname2c.cname2 → c_cname2若多條路徑指向同一組件類別 (如上例 B.c 與 A.c 皆為 C),預設會產生不同欄位 (b_c_cname2、c_cname2),不會重複。
若需自訂欄位名或屬性,使用 @AttributeOverrides 於實體屬性上:
@Entity
public class A {
@Id @GeneratedValue private int id;
@Embedded
@AttributeOverrides({
@AttributeOverride(name = "bname", column = @Column(name = "custom_bname")),
@AttributeOverride(name = "c.cname2", column = @Column(name = "b_c_cname_override"))
})
private B b;
@Embedded
@AttributeOverride(name = "cname2", column = @Column(name = "direct_cname"))
private C c;
// ...
}
name 使用點號路徑指向巢狀屬性;column 可設定名稱、長度、唯一約束等。
組件亦可用於集合 (@ElementCollection),生成獨立表儲存組件實例,表主鍵為 (實體FK + 組件欄位)。
@Embeddable 類別無主鍵、無獨立表,隨宿主實體生命週期。@AttributeOverride 提供彈性欄位客製化,支援巢狀路徑。