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

Hibernate 註解組件映射 (@Embeddable) 與屬性覆寫

     編輯:J2EE

前言

組件 映射將一個類別的屬性「內嵌」至另一個實體的資料表中,組件類別本身不擁有獨立生命週期與主鍵,僅作為屬性群組存在。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_bname
  • b.c.cname2 → b_c_cname2
  • c.cname2 → c_cname2

若多條路徑指向同一組件類別 (如上例 B.c 與 A.c 皆為 C),預設會產生不同欄位 (b_c_cname2、c_cname2),不會重複。

屬性覆寫 (@AttributeOverride)

若需自訂欄位名或屬性,使用 @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 提供彈性欄位客製化,支援巢狀路徑。
  • 適用於「值物件」領域模型 (如 Address、Money、Name 等)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved