<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # Hibernate / JPA2 持久化注解教程 > 原文: [https://howtodoinjava.com/hibernate/hibernate-jpa-2-persistence-annotations-tutorial/](https://howtodoinjava.com/hibernate/hibernate-jpa-2-persistence-annotations-tutorial/) 此 [**Hibernate**](//howtodoinjava.com/hibernate-tutorials/ "Hibernate Tutorials")(或 JPA2)持久化注解教程包含對 Java POJO 進行注解以使其充當持久化 JPA 實體時可能需要的所有重要注解的概述。 本教程首先定義一個 POJO “`EmployeeEntity`”,在其中定義一些屬性,并具有各自的獲取器和設置器方法。 在學習新注解時,我們將這些注解應用于`EmployeeEntity`,然后我們將了解該特定注解的含義。 讓我們快速列出注解,我們將在本教程中進行討論。 ```java Table of Contents **Most used JPA Annotations** Entity Beans with `@Entity` Primary Keys with `@Id` and `@GeneratedValue` Generating Primary Key Values with `@SequenceGenerator` Generating Primary Key Values with `@TableGenerator` Compound Primary Keys with `@Id`, `@IdClass`, or `@EmbeddedId` Database Table Mapping with `@Table` and `@SecondaryTable` Persisting Basic Types with `@Basic` Omitting Persistence with `@Transient` Mapping Properties and Fields with `@Column` **Modeling Entity Relationships** **Mapping Inheritance Hierarchies** Single Table Joined Table Table per Concrete Class **Other JPA2 Persistence Annotations** Temporal Data with `@Temporal` Element Collections with `@ElementCollection` Large Objects with `@Lob` Mapped Superclasses with `@MappedSuperclass` Ordering Collections with `@OrderColumn` **Named Queries (HQL or JPQL)** `@NamedQuery` and `@NamedQueries` Named Native Queries using `@NamedNativeQuery` ``` 上面的列表是一個很大的列表,列出的項目的完整詳細信息的范圍較小,但是我將嘗試包括所有相關信息,這將有助于您做出決定。 首先,我們寫下`EmployeeEntity` POJO,然后在整個討論中開始使用`JPA annotations`裝飾它。 ```java package com.howtodoinjava.demo.test; import java.io.Serializable; public class EmployeeEntity implements Serializable { private static final long serialVersionUID = 570235488278506106L; private Integer employeeId; private String firstName; private String lastName; public Integer getEmployeeId() { return employeeId; } public void setEmployeeId(Integer employeeId) { this.employeeId = employeeId; } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } } ``` ## 最常用的 JPA 注解 ## Hibernate / JPA2 `@Entity`注解教程 這是將 POJO 標記為 JPA 實體的第一步。 為此,我們需要應用`@Entity`注解,如下所示: ```java import javax.persistence.Entity; @Entity public class EmployeeEntity implements Serializable { public EmployeeEntity(){ } //Other code } ``` JPA2 標準注解包含在`javax.persistence`包中,因此我們從此包中導入了注解。 `@Entity`注解將該類標記為實體 Bean,因此它**必須具有無參數構造器**,該構造器至少在受保護的范圍(特定于 JPA)下可見。 Hibernate 至少支持包作用域,但是您會失去對其他 JPA 實現的可移植性,因為它們可能只允許受保護級別作用域。 理想情況下,您應該將此構造器公開,這也使其與其他規范高度兼容。 還有更多規則,例如 POJO 類的欲望不是最終的。 而且也不能是抽象的。 現在,讓我們快速瀏覽一下“`@org.hibernate.annotations.Entity`”注解(特定于 Hiberate)。 使用它,您可以為特定于 Hiberate 的實體定義一些額外的行為。 `@javax.persistence.Entity`仍然是強制性的,`@org.hibernate.annotations.Entity`是一種鼓勵,而不是替代。 ```java @javax.persistence.Entity @org.hibernate.annotations.Entity( selectBeforeUpdate = true, dynamicInsert = true, dynamicUpdate = true, optimisticLock = OptimisticLockType.ALL, polymorphism = PolymorphismType.EXPLICIT, mutable = false) public class EmployeeEntity implements Serializable { public EmployeeEntity(){ } //Other code } ``` 所有上述屬性在很久以前就已被標記為已棄用,但仍受支持。 我僅給出示例供參考。 實際上,在新版本的 Hiberate 下,您根本不需要使用`@org.hibernate.annotations.Entity`。 相反,您可以僅使用注解直接添加所需的行為。 讓我們看一下上面編寫的實體的等效代碼。 ```java import org.hibernate.annotations.DynamicInsert; import org.hibernate.annotations.DynamicUpdate; import org.hibernate.annotations.OptimisticLockType; import org.hibernate.annotations.OptimisticLocking; import org.hibernate.annotations.Polymorphism; import org.hibernate.annotations.PolymorphismType; import org.hibernate.annotations.SelectBeforeUpdate; @javax.persistence.Entity @SelectBeforeUpdate @DynamicInsert @DynamicUpdate @Polymorphism (type = PolymorphismType.EXPLICIT) @OptimisticLocking (type = OptimisticLockType.ALL) public class EmployeeEntity implements Serializable { public EmployeeEntity(){ } //Other code } ``` 繼續,如果需要,在代碼中使用這些注解。 ## 使用`@Id`和`@GeneratedValue`的主鍵 每個實體 bean 必須具有一個主鍵,您可以在主類上使用`@Id`注解對其進行注解。 通常,主鍵將是單個字段,盡管它也可以是多個字段的組合,我們將在后面的部分中看到。 `@Id`注解的位置決定了 Hibernate 將用于映射的默認訪問策略。 如果將注解應用于字段,如下所示,則將使用“字段訪問”。 ```java @Id private Integer employeeId; ``` 相反,如果將注解應用于字段的訪問器,則將使用屬性訪問。 ```java @Id public Integer getEmployeeId() { return employeeId; } ``` 屬性訪問意味著 Hibernate 將調用獲取器和設置器,而不是直接直接設置字段,而在字段訪問的情況下,它會這樣做。 如果需要,這可以靈活地更改在`id`字段中設置的實際值的值。 此外,您還可以在設置器中為其他字段設置“`id`”字段時應用額外的邏輯。 默認情況下,`@Id`注解不會創建主鍵生成策略,這意味著作為代碼的作者,您需要通過設置顯式調用設置器方法的方式來確定有效的主鍵。 或者,您可以使用`@GeneratedValue`注解。 `@GeneratedValue`注解具有一對屬性:`strategy`和`generator `如下: ```java @Id @GeneratedValue (strategy = GenerationType.SEQUENCE) private Integer employeeId; //OR a more complex use can be @Id @GeneratedValue(strategy=GenerationType.TABLE , generator="employee_generator") @TableGenerator(name="employee_generator", table="pk_table", pkColumnName="name", valueColumnName="value", allocationSize=100) private Integer employeeId; ``` 策略屬性必須是`javax.persistence.GeneratorType`枚舉中的值。 如果未指定生成器類型,則默認為`AUTO`。 `GeneratorType`上有四種不同類型的主鍵生成器,如下所示: 1. **`AUTO`**:Hibernate 根據數據庫對主鍵生成的支持來決定使用哪種生成器類型。 2. **`IDENTITY`**:數據庫負責確定和分配下一個主鍵。 3. **`SEQUENCE`**:某些數據庫支持`SEQUENCE`列類型。 它使用`@SequenceGenerator`。 4. **`TABLE`**:此類型保留一個帶有主鍵值的單獨表。 它使用`@TableGenerator`。 `generator`屬性允許使用上面的代碼示例中所示的自定義生成機制。 ## 使用`@SequenceGenerator`生成主鍵值 序列是一個數據庫對象,可用作主鍵值的源。 它與標識列類型的使用類似,不同之處在于序列獨立于任何特定表,因此可以被多個表使用。 要聲明要使用的特定序列對象及其屬性,必須在帶注解的字段上包含`@SequenceGenerator`注解。 這是一個例子: ```java @Id @SequenceGenerator(name="seq1",sequenceName="HIB_SEQ") @GeneratedValue(strategy=SEQUENCE,generator="seq1") private Integer employeeId; ``` 在此,已聲明了名為`seq1`的序列生成注解。 這指的是稱為`HIB_SEQ`的數據庫序列對象。 然后,將名稱`seq1`引用為`@GeneratedValue`注解的生成器屬性。 僅序列生成器名稱是必需的; 其他屬性將采用合理的默認值,但是作為一種好的做法,您應該為`sequenceName`屬性提供一個明確的值。 如果未指定,則持久化供應器將選擇要使用的`sequenceName`值。 ## 使用`@TableGenerator`生成主鍵值 `@TableGenerator`注解的使用方式與`@SequenceGenerator`注解非常相似,但是由于`@TableGenerator`操縱標準數據庫表來獲取其主鍵值,因此無需使用特定于供應商的序列對象,因此可以保證 在數據庫平臺之間可移植。 為了獲得最佳的可移植性和最佳性能,您不應指定使用表生成器,而應使用`@GeneratorValue(strategy=GeneratorType.AUTO)`配置,該配置允許持久性提供程序為數據庫選擇最合適的策略。 與序列生成器一樣,`@TableGenerator`的名稱屬性是必需的,其他屬性是可選的,并且表詳細信息由持久化供應器選擇。 讓我們再來看一個例子。 ```java @Id @GeneratedValue(strategy=GenerationType.TABLE , generator="employee_generator") @TableGenerator(name="employee_generator", table="pk_table", pkColumnName="name", valueColumnName="value", allocationSize=100) private Integer employeeId; ``` 可選屬性如下: * **`allocationSize`**:允許一次設置主鍵的數量以提高性能。 * **`catalog`**:允許指定表所在的目錄。 * **`initialValue`**:允許指定起始主鍵值。 * **`pkColumnName`**:允許標識表的主鍵列。 該表可以包含為多個實體生成主鍵值所需的詳細信息。 * **`pkColumnValue`**:允許標識包含主鍵生成信息的行的主鍵。 * **schema**:允許指定表所在的模式。 * **`table`**:包含主鍵值的表的名稱。 * **`uniqueConstraints`**:允許將其他約束應用于表以生成模式。 * **`valueColumnName`**:允許標識包含當前實體的主鍵生成信息的列。 因為該表可用于包含各種條目的主鍵值,所以使用該表的每個實體可能只有一行。 因此,它需要自己的主鍵(`pkColumnName`),以及包含從中獲取主鍵的任何實體要使用的下一個主鍵值(`pkColumnValue`)的列。 ## 使用`@Id`,`@IdClass`或`@EmbeddedId`的復合主鍵 盡管出于各種原因使用單列代理鍵是有利的,但有時您可能不得不使用業務鍵。 當它們包含在單個列中時,您可以使用`@Id`而無需指定生成策略,該策略強制用戶在持久保存實體之前分配主鍵值。 但是,如果是多列主鍵,則必須創建一個代表該主鍵的類。 當然,它不需要自己的主鍵,但它必須是公共類,必須具有默認構造器,必須可序列化,并且必須[**實現`hashCode()`和`equals()`方法**](//howtodoinjava.com/java/related-concepts/working-with-hashcode-and-equals-methods-in-java/ "Working with hashCode and equals methods in java"),以允許 Hibernate 代碼測試主鍵沖突。 一旦創建了此主鍵類,就可以使用以下三種策略: 1. 將其標記為`@Embeddable`并為其添加一個普通屬性,并標記為`@Id`。 2. 向您的實體類添加一個普通屬性,標記為`@EmbeddableId`。 3. 將屬性的所有字段添加到您的實體類中,用`@Id`標記它們,并用`@IdClass`標記您的實體類,以提供主鍵類的類。 使用帶有標記為`@Embeddable`的類的`@Id`是最自然的方法。 無論如何,`@Embeddable`標簽可用于非主鍵可嵌入值。 它允許您將復合主鍵視為單個屬性,并允許在其他表中重用`@Embeddable`類。 值得一提的是:嵌入式主鍵類必須可序列化。 > 可以在這里閱讀詳細的示例: [http://docs.oracle.com/javaee/6/api/javax/persistence/Embeddable.html](https://docs.oracle.com/javaee/6/api/javax/persistence/Embeddable.html) ## 使用`@Table`和`@SecondaryTable`進行數據庫表映射 默認情況下,表名稱是從實體名稱派生的。 因此,給定一個帶有簡單`@Entity`注解的`Employee`類,表名將為“`employee`”,并根據數據庫的配置進行了調整。 如果實體名稱發生更改(通過在`@Entity`注解中提供其他名稱,例如`@Entity("EMP_MASTER")`,則新名稱將用作表名。 可以進一步自定義表名,并且可以通過`@Table`注解配置其他與數據庫相關的屬性。 該注解允許您指定表的許多詳細信息,這些詳細信息將用于將實體保留在數據庫中。 如前所述,如果省略注解,則 Hibernate 將默認使用類名作為表名,因此,如果要覆蓋該行為,則只需提供此注解。 `@Table`注解提供了四個屬性,使您可以覆蓋表的名稱,表的目錄及其架構,并對表中的列實現唯一約束。 通常,您只能提供一個替代表名稱,例如:`@Table(name="ORDER_HISTORY")`。 如果數據庫模式是從帶注解的類生成的,則將應用唯一約束,并將補充任何特定于列的約束。 否則不會強制執行。 `@SecondaryTable`注解提供了一種對實體 bean 進行建模的方法,該實體 bean 跨多個不同的數據庫表保留。 在這里,除了為主數據庫表提供`@Table`注解之外,您的實體 bean 還可以具有`@SecondaryTable`注解或包含零個或多個`@SecondaryTable`注解的`@SecondaryTables`注解。 `@SecondaryTable`注解具有與`@Table`注解相同的基本屬性,但附加了`join`屬性。 `join`屬性定義主數據庫表的連接列。 它接受`javax.persistence.PrimaryKeyJoinColumn`對象的數組。 如果省略`join`屬性,則將假定表在相同名稱的主鍵列上進行了連接。 從輔助表中提取實體中的屬性時,必須使用`@Column`注解對其進行標記,并使用表屬性標識適當的表。 ```java @Entity @Table(name = "employee") @SecondaryTable(name = "employee_details") public class EmployeeEntity implements Serializable { @Id @GeneratedValue (strategy = GenerationType.SEQUENCE) private Integer employeeId; private String firstName; private String lastName; @Column(table = "employee_details") public String address; } ``` 通過在`@Table`或`@SecondaryTable`的`uniqueConstraints`屬性中添加一個或多個適當的`@UniqueConstraint`注解,可以將主表或輔助表中的列標記為具有唯一值。 或者,您也可以在`@Column`屬性上的`unique`屬性在字段級別設置唯一性。 ```java @Entity @Table( name="employee", uniqueConstraints={@UniqueConstraint(columnNames="firstName")} ) @SecondaryTable(name = "employee_details") public class EmployeeEntity implements Serializable{ } ``` ## 使用`@Basic`保留基本類型 默認情況下,POJO 中的屬性和實例變量是持久化的。 Hibernate 將為您存儲它們的值。 因此,最簡單的映射適用于“基本”類型。 這些包括基本類型,基本類型包裝器,基本類型或包裝器數組,枚舉以及實現`Serializable`但本身不是映射實體的任何類型。 這些都隱式映射 - 無需注解。 默認情況下,此類字段被映射到單個列,并且熱切獲取用于檢索它們(即,當從數據庫中檢索實體時,將檢索所有基本字段和屬性)。 同樣,當字段或屬性不是基元時,可以將其存儲和檢索為空值。 通過將`@Basic`注解應用于適當的類成員,可以覆蓋此默認行為。 注解具有兩個可選屬性,并且本身是完全可選的。 第一個屬性被命名為可選,并帶有一個布爾值。 默認為`true`,可以將其設置為`false`,以提示架構生成應創建關聯列`NOT NULL`。 第二個名為`fetch`,它采用枚舉`FetchType`的成員。 默認情況下為`EAGER`,但可以設置為`LAZY`以允許在訪問值時加載。 ```java @Basic (fetch = FetchType.LAZY, optional = false) private String firstName; ``` 延遲加載的使用不太可能有價值,除非將大型可序列化對象映射為基本類型(而不是為其提供給定的實體映射),并且檢索時間可能變得很長。 雖然必須遵守(默認)`EAGER`值,但是`LAZY`標志被視為提示,并且可以由持久化引擎忽略。 通常會省略`@Basic`屬性,而使用`@Column`屬性,否則可能會使用`@Basic`注解的可選屬性來提供`NOT NULL`行為。 ## 使用`@Transient`省略持久化 某些字段(例如,計算值)只能在運行時使用,并且應將它們保留在數據庫中,并從對象中將其丟棄。 JPA 規范為這些瞬態字段提供了`@Transient`注解。 `@Transient`注解沒有任何屬性 - 您只需將其添加到實例變量或適合實體 bean 的屬性訪問策略的設置器方法中即可。 `@Transient`注解突出顯示了在 Hibernate 中使用注解和使用 XML 映射文檔之間的重要區別之一。 使用注解,Hibernate 將默認保留所有字段在映射對象上的持久化。 使用 XML 映射文檔時,Hibernate 要求您明確告訴它哪些字段將被保留。 例如,如果我們的`EmployeeEntity`有兩個附加字段“`age`”和“`dateOfBirth`”,則您想將`dateOfBirth`存儲在數據庫中,但是您想根據`dateOfBirth`的值來計算運行時的年齡。 因此,“`age`”字段必須標記為瞬態。 ```java @Transient private Integer age; ``` ## 使用`@Column`映射屬性和字段 `@Column`注解用于指定字段或屬性將映射到的列的詳細信息。 其中一些細節與架構相關,因此僅在從注解文件生成架構時才適用。 其他應用則由 Hibernate(或 JPA2 持久化引擎)在運行時應用并強制執行。 它是可選的,具有一組適當的默認行為,但是在覆蓋默認行為或需要將對象模型適合到預先存在的架構中時通常很有用。 以下屬性通常被覆蓋: 1. **`name`**:允許明確指定列的名稱 - 默認情況下,這將是屬性的名稱。 2. **`length`** :允許顯式定義用于映射值(尤其是`String`值)的列的大小。 列大小默認為 255,例如,否則可能會導致字符串數據被截斷。 3. **`nullable`**:允許在生成架構時將該列標記為`NOT NULL`。 默認設置是字段應允許為空; 但是,當字段是或應該是必填字段時,通常會覆蓋此字段。 4. **`unique`**:允許將該列標記為僅包含唯一值。 默認為`false`,但通常將其設置為一個值,該值可能不是主鍵,但是如果重復(例如用戶名)仍會引起問題。 ```java @Column(name="FNAME",length=100,nullable=false) private String firstName; ``` 還有更多屬性,這些屬性在現實生活項目中很少使用。 這些是`table`, `insertable`, `updatable`, `columnDefinition`, `precision`和`scale`。 我將讓您詳細探討它們。 ## 建模實體關系 我已經在單獨的詳細帖子中介紹了與建模相關的概念。 請在這些鏈接的文章中閱讀有關它們的更多信息,因為此處沒有重復的信息是沒有意義的。 1. [**建模`@OneToOne`關系**](//howtodoinjava.com/hibernate/hibernate-one-to-one-mapping-using-annotations/ "Hibernate one-to-one mapping using annotations") 2. [**建模`@OneToMany`關系**](//howtodoinjava.com/hibernate/hibernate-one-to-many-mapping-using-annotations/ "Hibernate one-to-many mapping using annotations") 3. [**建模`@ManyToMany`關系**](//howtodoinjava.com/hibernate/hibernate-many-to-many-mapping-using-annotations "Hibernate one-to-many mapping using annotations") ## 映射繼承層次結構 實體并不總是與其他實體關聯為屬性; 有時,它們使用常規的 OOP 繼承規則進行關聯。 Hibernate 允許您使用`@Inheritance`注解來履行此類關系。 JPA2 標準和 Hibernate 都支持將繼承層次結構映射到數據庫中的三種方法。 這些如下: 1. **單個表(`SINGLE_TABLE`)**:每個類層次結構都有一個表 2. **已連接(`JOINED`)**:每個子類一個表(包括接口和抽象類) 3. **每類表(`TABLE_PER_CLASS`)**:每個具體類實現一個表 與繼承相關的持久化實體必須使用`@Inheritance`注解進行標記。 這采用單個策略屬性,該屬性設置為與這些方法相對應的三個`javax.persistence.InheritanceType`枚舉值之一(即`SINGLE_TABLE`,`JOINED`或`TABLE_PER_CLASS`)。 讓我們詳細討論一下。 ## 單表 單表方法為主要超類及其所有子類型管理一個數據庫表。 超類的每個映射字段或屬性以及派生類型的每個不同字段或屬性都有列。 遵循此策略時,您將需要確保在層次結構中任何字段或屬性名稱沖突時,對列進行適當的重命名。 為了確定從數據庫中檢索實體時要實例化的適當類型,應在持久化層次結構的根(且僅在根中)中提供`@DiscriminatorColumn`注解。 現在讓我們看一個簡單的例子。 我要讓您閱讀更多有關 Hiberate 的官方文檔中的內容。 我將在以后的文章中詳細介紹它們。 ```java //The Root of the Inheritance Hierarchy Mapped with the SINGLE_TABLE Strategy @Entity @Inheritance(strategy = SINGLE_TABLE) @DiscriminatorColumn( name="DISCRIMINATOR", discriminatorType=INTEGER ) @DiscriminatorValue("1") public class Book { ... } //A Derived Entity in the Inheritance Hierarchy @Entity @DiscriminatorValue("2") public class ComputerBook extends Book { ... } ``` ## 連接表 整體式單表方法的替代方法是其他類似的聯合表方法。 此處使用了“區分符”列,但各種派生類型的字段存儲在不同的表中。 ```java @Entity @Inheritance(strategy = JOINED) @DiscriminatorColumn name="DISCRIMINATOR" ) public class Book { ... } ``` ## 每類表 最后,有一種每類表方法,其中繼承層次結構中每種類型的所有字段都存儲在不同的表中。 由于實體與其表之間的緊密對應關系,因此`@DiscriminatorColumn`注解不適用于此繼承策略。 ```java @Entity @Inheritance(strategy = TABLE_PER_CLASS) public class Book { ... } ``` ## 其他 JPA2 持久化注解 盡管我們現在涵蓋了大多數核心 JPA2 持久化注解,但是您還會經常遇到其他一些注解。 我們將在以下各節中介紹其中一些內容。 ## `@Temporal`的時間數據 具有`java.util.Date`或`java.util.Calendar`類型的實體的字段或屬性表示時間數據。 默認情況下,它們將存儲在`TIMESTAMP`數據類型的列中,但是可以用`@Temporal`注解覆蓋此默認行為。 注解接受`javax.persistence.TemporalType`枚舉的單個值屬性。 這提供了三個可能的值:`DATE`,`TIME`和`TIMESTAMP`。 這些分別對應于`java.sql.Date`,`java.sql.Time`和`java.sql.Timestamp`。 在架構生成時為`table`列提供了適當的數據類型。 ```java @Temporal(TemporalType.TIME) java.util.Date startingTime; ``` ## `@ElementCollection`的元素集合 除了使用一對多映射來映射集合之外,JPA2 還引入了`@ElementCollection`注解,用于映射基本或可嵌入類的集合。 您可以使用`@ElementCollection`注解來簡化映射。 ```java @ElementCollection List<String> passwordHints; ``` `@ElementCollection`注解上有兩個屬性`targetClass`和`fetch`。 `targetClass`屬性告訴 Hibernate 集合中存儲了哪個類。 如果在集合上使用泛型,則無需指定`targetClass`,因為 Hibernate 會推斷出正確的類。 `fetch`屬性采用枚舉`FetchType`的成員。 默認情況下為`EAGER`,但可以將其設置為`LAZY`以在訪問該值時允許加載。 ## `@Lob`的大對象 通過應用`@Lob`注解,可以將持久化屬性或字段標記為持久化數據庫支持的大對象類型。 注解不帶任何屬性,但是將從字段或參數的類型中推斷出要使用的基礎大對象類型。 基于字符串和字符的類型將存儲在適當的基于字符的類型中,即 CLOB。 所有其他對象將存儲在 BLOB 中。 ```java @Lob String content; // a very long article ``` `@Lob`注解可以與`@Basic`或`@ElementCollection`注解結合使用。 ## 用`@MappedSuperclass`映射超類 當層次結構的根本身不是持久實體,而是派生自它的各種類時,就會發生繼承的特殊情況。 這樣的類可以是抽象的或具體的。 `@MappedSuperclass`注解允許您利用這種情況。 標有`@MappedSuperclass`的類不是實體,并且不可查詢(不能傳遞給在`Session`或`EntityManager`對象中需要實體的方法)。 它不能是關聯的目標。 超類列的映射信息將與派生類的詳細信息存儲在同一表中。 ## 使用`@OrderColumn`排序集合 盡管`@OrderBy`允許從數據庫中檢索數據后進行排序,但 JPA2 還提供了一個注解,該注解允許在數據庫中維護適當集合類型(例如`List`)的排序; 它通過維護代表該順序的有序列來實現。 這是一個例子: ```java @OneToMany @OrderColumn( name="employeeNumber" ) List<Employee> employees; ``` 在這里,我們聲明一個`employeeNumber`列將保持一個值,從 0 開始,并隨著每個條目添加到列表中而遞增。 默認的起始值可以被 base 屬性覆蓋。 默認情況下,該列可以包含空(無序)值。 通過將`nullable`屬性設置為`false`可以覆蓋可空性。 默認情況下,從注解生成模式時,該列被假定為整數類型; 但是,可以通過提供指定不同列定義字符串的`columnDefinition`屬性來覆蓋此屬性。 ## 命名查詢(HQL 或 JPQL) ## `@NamedQuery`和`@NamedQueries` `@NamedQuery`和`@NamedQueries`允許將一個或多個 Hiberate 查詢語言或 Java 持久化查詢語言(JPQL)查詢與實體相關聯。 必需的屬性如下: 1. **`name`**是用于檢索查詢的名稱。 2. **`query`**是與名稱關聯的 JPQL(或 HQL)查詢。 以下面的“`Author`”實體為例。 ```java @Entity @NamedQuery( name="findAuthorsByName", query="from Author where name = :author" ) public class Author { ... } ``` 該查詢將按名稱檢索`Author`實體,因此將其與該實體相關聯是很自然的。 但是,并沒有實際要求以這種方式將命名查詢與其所涉及的實體相關聯。 您不需要直接將查詢與其聲明所針對的實體相關聯,但是通常這樣做。 如果查詢與任何實體聲明沒有自然關聯,則可以在包級別進行`@NamedQuery`注解。 ## 使用`@NamedNativeQuery`和`@NamedNativeQueries`命名本地查詢 `@NamedNativeQuery`允許您編寫命名的 SQL 查詢,而`@NamedQuery`允許您編寫命名的 HQL 查詢(或 JPQL)。 通常,您應該更喜歡編寫 HQL 查詢,因為這樣您就可以讓 Hibernate 處理將 HQL 轉換為各種 SQL 方言的復雜過程。 當您選擇切換 DBMS 供應器時,這將使您的工作簡單得多。 ```java @NamedQueries({ @NamedQuery(name="get-emp-by-name",query="FROM EmployeeBean WHERE fName=:fName") }) //Equivalent NamedNativeQuery @NamedNativeQueries( { @NamedNativeQuery( name="get-emp-by-name-native", query="SELECT * FROM Employees WHERE firstName=:fName", resultClass=EmployeeEntity.class) } ) ``` 簡而言之,這就是本篇有限的教程,涵蓋了**最重要的 JPA2 持久化注解**。 我將在以后的教程中詳細介紹它們。 **祝您學習愉快!**
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看