
- JPA 教程
- JPA - 首頁
- JPA - 簡介
- JPA - 架構
- JPA - ORM 元件
- JPA - 安裝
- JPA - 實體管理器
- JPA - JPQL
- JPA - 高階對映
- JPA - 實體關係
- JPA - Criteria API
- JPA 有用資源
- JPA - 快速指南
- JPA - 有用資源
JPA - ORM 元件
大多數現代應用程式使用關係資料庫來儲存資料。最近,許多供應商轉向物件資料庫以減少其資料維護負擔。這意味著物件資料庫或物件關係技術負責儲存、檢索、更新和維護。這些物件關係技術的核心部分是對映 orm.xml 檔案。由於 xml 不需要編譯,因此我們可以輕鬆地對多個數據源進行更改,而無需進行大量管理。
物件關係對映
物件關係對映 (ORM) 簡要介紹了什麼是 ORM 及其工作原理。ORM 是一種將資料從物件型別轉換為關係型別,反之亦然的能力。
ORM 的主要功能是將物件對映或繫結到資料庫中的資料。在對映時,我們必須考慮資料、資料型別及其與自身實體或任何其他表中實體的關係。
高階功能
慣用的持久化:它使您能夠使用面向物件的類編寫持久化類。
高效能:它具有多種獲取技術和樂觀鎖定技術。
可靠性:它高度穩定且卓越。被許多工業程式設計師使用。
ORM 架構
以下是 ORM 架構。

上圖說明了物件資料如何分三個階段儲存到關係資料庫中。
階段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 的屬性可以分為布林屬性和非布林屬性。
非布林屬性包含getter 和setter 方法。
布林屬性包含setter 和is 方法。
任何屬性的getter 方法都應以小寫字母“get”(java 方法約定)開頭,然後是首字母大寫的欄位名稱。例如,欄位名稱為“salary”,因此該欄位的 getter 方法為“getSalary()”。
任何屬性的setter 方法都應以小寫字母“set”(java 方法約定)開頭,然後是首字母大寫的欄位名稱,以及要設定為欄位的引數值。例如,欄位名稱為“salary”,因此該欄位的 setter 方法為“setSalary(double sal)”。
對於布林屬性,is 方法用於檢查它是 true 還是 false。例如,布林屬性“empty”,該欄位的 is 方法為“isEmpty()”。