1. 程式人生 > >JPA 主鍵@Id、@IdClass、@Embeddable、@EmbeddedId

JPA 主鍵@Id、@IdClass、@Embeddable、@EmbeddedId

1、自動主鍵
預設情況下,主鍵是一個連續的64位數字(long),它由ObjectDB自動為儲存在資料庫中的每個新實體物件自動設定。資料庫中的第一個實體物件的主鍵是1,第二個實體物件的主鍵是2等等。當從資料庫中刪除實體物件時,主鍵值不會被回收。
一個實體的主鍵值可以通過宣告一個主鍵欄位來訪問:

@Entity
public class Project {
    @Id @GeneratedValue long id; // still set automatically
}

@id標註將欄位標記為一個主鍵欄位。當定義主鍵欄位時,主鍵值將被ObjectDB自動注入到該欄位中。
@generatedvalue註釋指定主鍵是由ObjectDB自動分配的
2、應用設定主鍵
如果一個實體有一個沒有@generatedvalue標記的主鍵欄位,則不會生成自動主鍵值,並且應用程式負責通過初始化主鍵欄位來設定主鍵。這必須在持久化實體物件的任何嘗試之前完成。

@Entity
public class Project {
    @Id long id; // must be initialized by the application
}

應用程式設定的主鍵欄位可以有以下型別:
● 原始型別: boolean, byte, short, char, int, long, float, double.
● java.lang包中的包裝型別:Byte, Short, Character, Integer, Long, Float, Double.
● java.math.BigInteger, java.math.BigDecimal.
● java.lang.String.
● java.util.Date, java.sql.Date, java.sql.Time, java.sql.Timestamp.
● 列舉型別
● 引用一個實體物件
3、複合主鍵
複合主鍵由多個主鍵欄位組成。每個主鍵欄位必須是上面列出的支援型別之一。
例如,以下專案實體類的主鍵由兩個欄位組成:

@Entity @IdClass(ProjectId.class)
public class Project {
    @Id int departmentId;
    @Id long projectId;
}

當一個實體有多個主鍵欄位時,JPA需要定義一個特殊的ID類,該類是使用@idclass註釋附加到實體類的。ID類反映了主鍵欄位,它的物件可以表示主鍵值:

Class ProjectId {
    int departmentId;
    long projectId;
}

ObjectDB不強制定義ID類。但是,如果實體物件必須按照檢索實體部分中所示的主鍵來檢索實體物件,那麼就需要ID類。

4、嵌入式主鍵
表示複合主鍵的另一種方法是使用可嵌入的類:

@Entity
public class Project {
    @EmbeddedId ProjectId id;
}

@Embeddable
Class ProjectId {
    int departmentId;
    long projectId;
}

主鍵欄位是在可嵌入類中定義的。該實體包含一個單獨的主鍵欄位,該欄位用@EmbeddedId 註釋,幷包含一個可嵌入類的例項。當使用這個表單時,沒有定義一個單獨的ID類,因為可嵌入的類本身可以表示完整的主鍵值。