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

EJB 3.0 複合主鍵實作:@IdClass 與 @EmbeddedId 兩種方案完整比較

     編輯:Java 相關知識

複合主鍵定義需求

  • 主鍵類別必須實作 equals()、hashCode()
  • 需實作 Serializable
  • 提供無參建構子
  • 標註 @IdClass 或 @EmbeddedId

方案一:@IdClass(主鍵類別獨立)


public class NamePK implements Serializable {
    private String first, last;
    // equals/hashCode
}

@Entity @IdClass(NamePK.class)
public class Student implements Serializable {
    @Id @Column(name="FIRST") private String first;
    @Id @Column(name="LAST") private String last;
    // 其他屬性...
}

方案二:@EmbeddedId(主鍵內嵌)


@Embeddable
public class NamePK implements Serializable {
    @Column(name="FIRST") private String first;
    @Column(name="LAST") private String last;
    // equals/hashCode
}

@Entity
public class Student implements Serializable {
    @EmbeddedId private NamePK namePK;
    // 其他屬性...
}

兩者差異比較

維度@IdClass@EmbeddedId
主鍵屬性在實體中獨立欄位,重複定義單一嵌入物件
查詢 APIem.find(Student.class, new NamePK("a","b"))相同
JPQL 存取s.first, s.lasts.namePK.first, s.namePK.last
適用場景既有資料表、需單獨存取主鍵欄位新設計、領域模型導向

完整範例(採 @IdClass)


@DependentObject public class Name implements Serializable {
    private String first, last;
    // equals/hashCode 實作
}

@Entity @Table(name="STUDENT") @IdClass(Name.class)
public class Student implements Serializable {
    @Id @Column(name="FIRST") public String getFirst() { return name.getFirst(); }
    @Id @Column(name="LAST") public String getLast() { return name.getLast(); }
    // ...
}

Client 驗證


Name pk = new Name("朱", "立煥");
Student s = dao.find(pk); // 透過複合主鍵查詢
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved