JPA - ORM 元件



大多數現代應用程式使用關係資料庫來儲存資料。最近,許多供應商轉向物件資料庫以減少其資料維護負擔。這意味著物件資料庫或物件關係技術負責儲存、檢索、更新和維護。這些物件關係技術的核心部分是對映 orm.xml 檔案。由於 xml 不需要編譯,因此我們可以輕鬆地對多個數據源進行更改,而無需進行大量管理。

物件關係對映

物件關係對映 (ORM) 簡要介紹了什麼是 ORM 及其工作原理。ORM 是一種將資料從物件型別轉換為關係型別,反之亦然的能力。

ORM 的主要功能是將物件對映或繫結到資料庫中的資料。在對映時,我們必須考慮資料、資料型別及其與自身實體或任何其他表中實體的關係。

高階功能

  • 慣用的持久化:它使您能夠使用面向物件的類編寫持久化類。

  • 高效能:它具有多種獲取技術和樂觀鎖定技術。

  • 可靠性:它高度穩定且卓越。被許多工業程式設計師使用。

ORM 架構

以下是 ORM 架構。

Object Relational Mapping

上圖說明了物件資料如何分三個階段儲存到關係資料庫中。

階段1

第一階段,稱為物件資料階段,包含 POJO 類、服務介面和類。它是主要的業務元件層,包含業務邏輯操作和屬性。

例如,讓我們以員工資料庫作為模式 -

  • Employee POJO 類包含諸如 ID、姓名、工資和職位之類的屬性。以及這些屬性的 setter 和 getter 方法。

  • Employee DAO/Service 類包含服務方法,例如建立員工、查詢員工和刪除員工。

階段 2

第二階段稱為對映持久化階段,其中包含 JPA 提供程式、對映檔案 (ORM.xml)、JPA 載入程式和物件網格。

  • JPA 提供程式:包含 JPA 風格 (javax.persistence) 的供應商產品。例如 Eclipselink、Toplink、Hibernate 等。

  • 對映檔案:對映檔案 (ORM.xml) 包含 POJO 類中的資料與關係資料庫中的資料之間的對映配置。

  • JPA 載入程式:JPA 載入程式的工作原理類似於快取記憶體,可以載入關係網格資料。它就像資料庫的副本,與服務類互動以獲取 POJO 資料(POJO 類的屬性)。

  • 物件網格:物件網格是一個臨時位置,可以儲存關係資料的副本,即類似於快取記憶體。所有針對資料庫的查詢首先都會在物件網格中的資料上生效。只有在提交後,它才會影響主資料庫。

階段 3

第三階段是關係資料階段。它包含與業務元件邏輯連線的關係資料。如上所述,只有當業務元件提交資料時,它才會物理儲存到資料庫中。在此之前,修改後的資料會以網格格式儲存在快取記憶體中。獲取資料的過程也是如此。

上述三個階段的程式化互動機制稱為物件關係對映。

Mapping.xml

mapping.xml 檔案用於指示 JPA 供應商將實體類與資料庫表進行對映。

讓我們以包含四個屬性的 Employee 實體為例。名為Employee.java 的 Employee 實體的 POJO 類如下所示

public class Employee {

   private int eid;
   private String ename;
   private double salary;
   private String deg;

   public Employee(int eid, String ename, double salary, String deg) {
      super( );
      this.eid = eid;
      this.ename = ename;
      this.salary = salary;
      this.deg = deg;
   }

   public Employee( ) {
      super();
   }

   public int getEid( ) {
      return eid;
   }
   
   public void setEid(int eid) {
      this.eid = eid;
   }
   
   public String getEname( ) {
      return ename;
   }
   
   public void setEname(String ename) {
      this.ename = ename;
   }

   public double getSalary( ) {
      return salary;
   }
   
   public void setSalary(double salary) {
      this.salary = salary;
   }

   public String getDeg( ) {
      return deg;
   }
   
   public void setDeg(String deg) {
      this.deg = deg;
   }
}

以上程式碼是 Employee 實體 POJO 類。它包含四個屬性 eid、ename、salary 和 deg。假設這些屬性是資料庫中的表字段,並且 eid 是該表的主鍵。現在我們必須為其設計 hibernate 對映檔案。名為mapping.xml 的對映檔案如下所示

<? xml version="1.0" encoding="UTF-8" ?>

<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm    
   http://java.sun.com/xml/ns/persistence/orm_1_0.xsd"
   version="1.0">
      
   <description> XML Mapping file</description>
      
   <entity class="Employee">        
      <table name="EMPLOYEETABLE"/>
      <attributes>
      
         <id name="eid">
            <generated-value strategy="TABLE"/>
         </id>

         <basic name="ename">
            <column name="EMP_NAME" length="100"/>
         </basic>
         
         <basic name="salary">
         </basic>
         
         <basic name="deg">
         </basic>
         
      </attributes>
   </entity>
   
</entity-mappings>

以上指令碼用於將實體類與資料庫表進行對映。在此檔案中

  • <entity-mappings>:標記定義架構定義,以允許將實體標記放入 xml 檔案中。

  • <description>:標記定義有關應用程式的描述。

  • <entity>:標記定義要轉換為資料庫中表的實體類。class 屬性定義 POJO 實體類名稱。

  • <table>:標記定義表名。如果要將類名作為表名,則此標記不是必需的。

  • <attributes>:標記定義屬性(表中的欄位)。

  • <id>:標記定義表的主鍵。<generated-value> 標記定義如何分配主鍵值,例如自動、手動或從序列中獲取。

  • <basic>:標記用於定義表的其餘屬性。

  • <column-name>:標記用於定義使用者定義的表字段名稱。

註解

通常,Xml 檔案用於配置特定元件,或對映元件的兩個不同規範。在我們的例子中,我們必須在框架中單獨維護 xml。這意味著在編寫對映 xml 檔案時,我們需要將 POJO 類屬性與 mapping.xml 檔案中的實體標記進行比較。

解決方案如下:在類定義中,我們可以使用註解編寫配置部分。註解用於類、屬性和方法。註解以“@”符號開頭。註解在宣告類、屬性或方法之前宣告。JPA 的所有註解都定義在 javax.persistence 包中。

以下是我們示例中使用的註解列表

註解 描述
@Entity 此註解指定將類宣告為實體或表。
@Table 此註解指定宣告表名。
@Basic 此註解明確指定非約束欄位。
@Embedded 此註解指定類或實體的屬性,其值為可嵌入類的例項。
@Id 此註解指定屬性,用於類的標識(表的主鍵)。
@GeneratedValue 此註解指定如何初始化標識屬性,例如自動、手動或從序列表中獲取值。
@Transient 此註解指定不持久的屬性,即該值永遠不會儲存到資料庫中。
@Column 此註解用於為持久化屬性指定列或屬性。
@SequenceGenerator 此註解用於定義在 @GeneratedValue 註解中指定的屬性的值。它建立一個序列。
@TableGenerator 此註解用於指定在 @GeneratedValue 註解中指定的屬性的值生成器。它建立一個用於值生成的表。
@AccessType 此型別的註解用於設定訪問型別。如果設定 @AccessType(FIELD),則將發生欄位級訪問。如果設定 @AccessType(PROPERTY),則將發生屬性級訪問。
@JoinColumn 此註解用於指定實體關聯或實體集合。這用於多對一和一對多關聯。
@UniqueConstraint 此註解用於指定欄位,主鍵或輔助表上的唯一約束。
@ColumnResult 此註解引用 SQL 查詢中使用 select 子句的列的名稱。
@ManyToMany 此註解用於定義連線表之間多對多關係。
@ManyToOne 此註解用於定義連線表之間多對一關係。
@OneToMany 此註解用於定義連線表之間一對多關係。
@OneToOne 此註解用於定義連線表之間一對一關係。
@NamedQueries 此註解用於指定命名查詢列表。
@NamedQuery 此註解用於使用靜態名稱指定查詢。

Java Bean 標準

Java 類,將例項值和行為封裝到稱為物件的單個單元中。Java Bean 是一個臨時儲存和可重用元件或物件。它是一個可序列化的類,具有預設建構函式和 getter 和 setter 方法,以分別初始化例項屬性。

Bean 約定

  • Bean 包含預設建構函式或包含序列化例項的檔案。因此,bean 可以例項化 bean。

  • bean 的屬性可以分為布林屬性和非布林屬性。

  • 非布林屬性包含gettersetter 方法。

  • 布林屬性包含setteris 方法。

  • 任何屬性的getter 方法都應以小寫字母“get”(java 方法約定)開頭,然後是首字母大寫的欄位名稱。例如,欄位名稱為“salary”,因此該欄位的 getter 方法為“getSalary()”。

  • 任何屬性的setter 方法都應以小寫字母“set”(java 方法約定)開頭,然後是首字母大寫的欄位名稱,以及要設定為欄位的引數值。例如,欄位名稱為“salary”,因此該欄位的 setter 方法為“setSalary(double sal)”。

  • 對於布林屬性,is 方法用於檢查它是 true 還是 false。例如,布林屬性“empty”,該欄位的 is 方法為“isEmpty()”。

廣告