天天看點

☕【Java技術指南】「JPA程式設計專題」讓你不再對JPA技術中的“持久化型注解”感到陌生了!

Java持久化API (JPA) 顯著簡化了Java Bean的持久性并提供了一個對象關系映射方法,該方法使您可以采用聲明方式定義如何通過一種标準的可移植方式,将Java 對象映射到關系資料庫表以及後續的一系列資料持久化行為。

JPA可以将任何普通的Java 對象 (POJO) 類指定為 JPA 實體。

JPA實體:一個應使用JPA實作程式的服務将其非臨時字段持久儲存到關系資料庫(在 Java EE EJB 容器的内部或在簡單 Java SE 應用程式中的 EJB 容器的外部)的 Java 對象。

可以使用注解配置實體的JPA行為,注解是一種使用中繼資料修飾 Java 源代碼的簡單表達方法,它編譯為相應的 Java 類檔案,以便在運作時由 JPA 持久化機制提供程式解釋以管理 JPA 行為。

例如,要将Java類指定為JPA實體,請使用@Entity注解:

☕【Java技術指南】「JPA程式設計專題」讓你不再對JPA技術中的“持久化型注解”感到陌生了!
☕【Java技術指南】「JPA程式設計專題」讓你不再對JPA技術中的“持久化型注解”感到陌生了!
使用 @Entity 批注将普通的舊式 Java 對象 (POJO) 類指定為實體,并使其可用于 JPA 服務。必須将 POJO 類指定為實體,然後才可以使用任何其他 JPA 批注。
☕【Java技術指南】「JPA程式設計專題」讓你不再對JPA技術中的“持久化型注解”感到陌生了!

預設情況下,JPA持續性提供程式假設實體的所有持久字段均存儲到一個名稱為實體名稱的資料庫表中(請參閱 @Entity )。 在以下條件下,使用 @Table注解可以指定與實體關聯的主表:

實體名稱難于處理、是一個保留字、與預先存在的資料模型不相容或作為資料庫中的表名無效需要控制表所屬的目錄或模式。

如果希望 JPA 将某些字段持久儲存到主表,而将其他字段持久儲存到一個或多個輔助表,請參閱@SecondaryTable 。 下表列出了此批注的屬性。有關更多詳細資訊,請參閱 API 。

☕【Java技術指南】「JPA程式設計專題」讓你不再對JPA技術中的“持久化型注解”感到陌生了!

如果使用 @GeneratedValue 批注指定一個 TABLE 類型的主鍵生成器,可以使用 @TableGenerator 批注微調該主鍵生成器以:

由于名稱難于處理、是一個保留字、與預先存在的資料模型不相容或作為資料庫中的表名無效而更改主鍵生成器的表名稱

更改配置設定大小以比對應用程式要求或資料庫性能參數

更改初始值以比對現有的資料模型(例如,如果基于已經為其配置設定或保留了一組主鍵值的現有資料集建構)

使用特定目錄或模式配置主鍵生成器的表

在主鍵生成器表的一列或多列商配置一個唯一的限制

☕【Java技術指南】「JPA程式設計專題」讓你不再對JPA技術中的“持久化型注解”感到陌生了!
☕【Java技術指南】「JPA程式設計專題」讓你不再對JPA技術中的“持久化型注解”感到陌生了!

顯示了如何使用此注解為名為 empGen 的 TABLE 主鍵生成器指定配置設定大小。

使用 @Temporal 注解指定 JPA 的提供程式應隻為 java.util.Date 和 java.util.Calendar 類型的字段或屬性持久儲存的資料庫類型,可以與 @Basic 一起使用。

☕【Java技術指南】「JPA程式設計專題」讓你不再對JPA技術中的“持久化型注解”感到陌生了!

示例,顯示了如何使用此批注指定 JPA 持續性提供程式應将 java.util.Date 字段 startDate 持久儲存為 DATE ( java.sql.Date ) 資料庫類型。

預設情況下,JPA 持久化提供程式假設實體的所有字段均為持久字段。

使用 @Transient 注解指定實體的非持久字段或屬性,例如,一個在運作時使用但并非實體狀态一部分的字段或屬性。

JPA 提供程式不會對批注為 @Transient 的屬性或字段持久儲存(或建立資料庫模式)。

該注解可以與 @Entity 、@MappedSuperclass 和 @Embeddable 一起使用。

該注解沒有屬性。

預設情況下,JPA 持續性提供程式假設每個實體的持久字段存儲在其名稱與持久字段的名稱相比對的資料庫表列中。

使用 @Column 批注:

将持久字段與其他名稱關聯(如果預設列名難于處理、與事先存在的資料模型不相容或作為資料庫中的列名無效)

将持久字段與輔助表中的列關聯(請參閱 @SecondaryTable )

微調資料庫中列的特征

☕【Java技術指南】「JPA程式設計專題」讓你不再對JPA技術中的“持久化型注解”感到陌生了!
☕【Java技術指南】「JPA程式設計專題」讓你不再對JPA技術中的“持久化型注解”感到陌生了!
☕【Java技術指南】「JPA程式設計專題」讓你不再對JPA技術中的“持久化型注解”感到陌生了!

如何使用此批注使 JPA 将 empId 持久儲存到輔助表 EMP_HR 中的列 EMP_NUM 。預設情況下,JPA 将 empName 持久儲存到主表 Employee 中的列 empName 。

預設情況下,JPA持久化提供程式假設所有列均可以包含重複值。

使用<code>@UniqueConstraint</code>注解指定将在為主表或輔助表生成的DDL中包含一個唯一限制,或者,您可以在列級别指定唯一限制。

☕【Java技術指南】「JPA程式設計專題」讓你不再對JPA技術中的“持久化型注解”感到陌生了!
顯示了如何使用此注解對主表 EMP 中的列 EMP_ID 和 EMP_NAME 指定一個唯一限制,使用唯一限制的 @Table。

預設情況下,JPA持久化提供程式假設應用程式負責資料一緻性。

使用@Version注解通過指定用作其樂觀鎖定值的實體類的版本字段或屬性來啟用 JPA 管理的樂觀鎖定(推薦做法)。

選擇版本字段或屬性時,確定:

每個實體隻有一個版本字段或屬性

選擇一個持久儲存到主表的屬性或字段(請參閱 @Table )

您的應用程式不修改版本屬性或字段

如何使用此注解将屬性<code>getVersionNum</code>指定為樂觀鎖定值。在該示例中,該屬性的列名設定為OPTLOCK(請參閱 @Column ),而非屬性的預設列名。

使用 @Embeddable 批注指定一個類,該類的執行個體存儲為擁有實體的固有部分并共享該實體的身份。嵌入對象的每個持久屬性或字段都将映射到實體的資料庫表。

類 EmploymentPeriod 在用作為 @Embedded 的持久字段的類型時可以嵌套到實體中.

使用 @Embedded 批注指定一個持久字段,該字段的 @Embeddable 類型可以存儲為擁有實體的固有部分,并共享該實體的身份。

嵌入對象的每個持久屬性或字段均映射到擁有實體的資料庫表。

可以結合使用 @Embedded 和 @Embeddable 以建立嚴格所有權關系的模型,以便在删除了擁有對象的情況下還将删除被擁有的對象。嵌入的對象不應映射到多個表。

@Embeddable 類中指定的列定義适用于 @Embedded 類。

如果要覆寫這些列定義,請使用 @AttributeOverride 。

@Embeddable 類 EmploymentPeriod可以使用指定的屬性覆寫嵌入到實體類中。

使用 @EmbeddedId 批注指定一個由實體擁有的可嵌入複合主鍵類(通常由兩個或更多基元類型或 JDK 對象類型組成)。從原有資料庫映射時(此時資料庫鍵由多列組成),通常将出現複合主鍵。

複合主鍵類具有下列特征:

它是一個普通的舊式 Java 對象 (POJO) 類。

它必須為 public ,并且必須有一個 public 無參數構造函數。

如果使用基于屬性的通路,則主鍵類的屬性必須為 public 或 protected 。

它必須是可序列化的。

它必須定義 equals 和 hashCode 方法。

這些方法的值相等性的語義必須與鍵映射到的資料庫類型的資料庫相等性一緻。

使用 @MappedSuperclass 批注指定一個實體類從中繼承持久字段的超類。當多個實體類共享通用的持久字段或屬性時,這将是一個友善的模式。

您可以像對實體那樣使用任何直接和關系映射批注(如 @Basic 和 @ManyToMany)對該超類的字段和屬性進行批注,但由于沒有針對該超類本身的表存在,是以這些映射隻适用于它的子類。繼承的持久字段或屬性屬于子類的表。

可以在子類中使用 @AttributeOverride 或 @AssociationOverride 批注來覆寫超類的映射配置。

如何使用此批注将 Employee 指定為映射超類。如何擴充實體中的此超類,以及如何在實體類中使用 @AttributeOverride 以覆寫超類中設定的配置。

@EntityListeners将一個或多個實體監聽程式類與 @Entity 或 @MappedSuperclass 關聯,條件是您需要在指定的生命周期事件發生時執行邏輯。

不希望在實體 API 中公開生命周期監聽程式方法。

要在不同的實體類型之間共享生命周期監聽程式邏輯。

當實體或子類上發生生命周期事件時,JPA 持續性提供程式将按監聽程式定義的順序通知每個實體監聽程式,并調用使用相應的生命周期事件類型進行批注的實體監聽程式方法(如果有)。

實體監聽程式類具有以下特征:

它是一個普通的舊式 Java 對象 (POJO) 類

它有一個或多個具有以下簽名的回調方法:

public void (Object)

可以指定參數類型 Object ,或實體監聽程式将與其關聯的實體類的類型。

它用一個或多個生命周期事件批注對每個回調方法進行批注。

一個生命周期事件隻能與一個回調監聽程式方法關聯,但某個給定的回調監聽程式方法可以與多個生命周期事件關聯。

如果使用實體監聽程式,則可以管理哪些實體監聽程式使用

☕【Java技術指南】「JPA程式設計專題」讓你不再對JPA技術中的“持久化型注解”感到陌生了!
顯示了您可以将多個生命周期事件與給定的實體監聽程式類方法關聯,但任何給定的生命周期事件隻能在實體監聽程式類中出現一次。
如果預設監聽程式行為不适用,請使用 @ExcludeDefaultListeners 批注覆寫(并阻止)針對給定 @Entity 或 @MappedSuperclass 執行的預設監聽程式。

極限就是為了超越而存在的