溫立輝
摘? 要:針對(duì)Java EE編程中的JPA持久化問題,討論了JPA的適用場(chǎng)景,闡述JPA規(guī)范的應(yīng)用原理;在論述中詳細(xì)分析了JPA持久化過程中的4種不同數(shù)據(jù)實(shí)體狀態(tài),以及不同實(shí)體狀態(tài)的轉(zhuǎn)化條件及相關(guān)的API操作接口;同時(shí)也分析了數(shù)據(jù)實(shí)體間的關(guān)聯(lián)關(guān)系,以及不同關(guān)聯(lián)關(guān)系在JPA持久化ORM技術(shù)中配置實(shí)現(xiàn),最后說明了JPQL語句的原生SQL語句的區(qū)別以及其在Java EE領(lǐng)域的重要作用。
關(guān)鍵詞:JPA? JPQL? 持久化規(guī)范? ORM
中圖分類號(hào):TP311.52? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 文獻(xiàn)標(biāo)識(shí)碼:A? ? ? ? ? ? ? ? ? ? ? ? 文章編號(hào):1672-3791(2019)02(c)-0005-02
JPA即Java 持久化API(Java Persistence API),是Java EE5后提出的的一個(gè)持久化規(guī)范,此規(guī)范參照了EJB3的 Entity Bean(實(shí)體Bean)實(shí)現(xiàn)過程,其使用JPQL語句來對(duì)表實(shí)體進(jìn)行CRUD的操作,在Java語言企業(yè)級(jí)編程存在著非常廣泛的應(yīng)用。
1? JPA概述
JPA作為一個(gè)持久化規(guī)范,其專門負(fù)責(zé)定義與數(shù)據(jù)存儲(chǔ)層的交互標(biāo)準(zhǔn),定義交互過程,其作為規(guī)范,只定義了上層接口,并不負(fù)責(zé)具體的實(shí)現(xiàn)過程,實(shí)際上在開發(fā)市場(chǎng)中,JPA有眾多的實(shí)現(xiàn)方式,如Hibernate、TopLink、OpenJPA等持久化框架。
JPA作為一套數(shù)據(jù)持久化的規(guī)范,其思想對(duì)ORM編程繼承與細(xì)化,在Java編程中由于面向?qū)ο缶幊趟枷肱c關(guān)系型數(shù)據(jù)庫的思維差別,致使應(yīng)用程序與關(guān)系數(shù)據(jù)庫存在一定的交互障礙,ORM作為面向?qū)ο蟮膽?yīng)用程序與關(guān)系型數(shù)據(jù)庫間的交互中介橋梁,解決了開發(fā)中編碼問題,使用開發(fā)人員能用使用面向?qū)ο蟮乃季S去處理和操作關(guān)系庫。
2? JPA狀態(tài)表述
在JPA規(guī)范中,實(shí)體狀態(tài)的變化都是通過EntityManager接口下的相關(guān)函數(shù)的被調(diào)用而觸發(fā)的,一個(gè)實(shí)體從對(duì)象變成數(shù)據(jù)庫表中的一條記錄,一共可經(jīng)歷4個(gè)狀態(tài),分別是:新建狀態(tài)(New)、游離狀態(tài)(Detached)、受控狀態(tài)(Managed)、刪除狀態(tài)(Removed)。
新建狀態(tài):當(dāng)一個(gè)實(shí)體對(duì)象剛剛通過new創(chuàng)建出來,還未和其他持久化機(jī)制發(fā)生任何關(guān)聯(lián),這時(shí)這個(gè)實(shí)體的實(shí)例處于新建狀態(tài)。
游離狀態(tài):當(dāng)實(shí)體對(duì)象已經(jīng)從持久化機(jī)制中得到唯一主鍵,但實(shí)例未與持久化機(jī)制發(fā)生關(guān)聯(lián)關(guān)系,則此時(shí)對(duì)象處于游離狀態(tài),當(dāng)通過EntityManager接口調(diào)用clear()方法,實(shí)例對(duì)象進(jìn)入游離狀態(tài)。
受控狀態(tài):實(shí)體對(duì)象已經(jīng)從持久化機(jī)制中得到唯一主鍵,且已經(jīng)與持久化機(jī)制發(fā)生關(guān)聯(lián)關(guān)系,則對(duì)象處于受控狀態(tài),當(dāng)通過EntityManager接口調(diào)用persist()方法,實(shí)例對(duì)象進(jìn)入游離狀態(tài)。
刪除狀態(tài):如果一個(gè)實(shí)體對(duì)象滿足受控的基本要求,即處于受控狀態(tài),此時(shí)將對(duì)象刪除,則對(duì)象進(jìn)入刪除狀態(tài),當(dāng)通過EntityManager接口調(diào)用remove()方法,實(shí)例對(duì)象到達(dá)刪除狀態(tài)。
3? JPA關(guān)系實(shí)體表述
JPA作為持久化的操作規(guī)范,其對(duì)應(yīng)用程序中實(shí)體間的關(guān)系作了明確的定義,共分三大類型,分別是:一對(duì)一(one to one)、一對(duì)多(one to many)、多對(duì)多(many to many),接下來以Hibernate框架的JPA實(shí)現(xiàn)為載體來進(jìn)行各種實(shí)體關(guān)系的分析。
一對(duì)一:就是兩個(gè)實(shí)體間,一方實(shí)體的任一實(shí)例只能對(duì)應(yīng)于另一方實(shí)體唯一的實(shí)例。在日常生活中,例如個(gè)人與身份證號(hào)碼的關(guān)系,每個(gè)人都有唯一的一個(gè)身份證號(hào)碼,同時(shí)每個(gè)身份證號(hào)碼都只能屬于某一個(gè)人。
具體實(shí)現(xiàn)需要在每個(gè)實(shí)體中引入對(duì)方實(shí)體作為本類的一個(gè)全局屬性。如需要在用戶(Person)類中引入對(duì)方:private Idcard idcard;同時(shí)需要在身份證(Idcard)類引對(duì)方:private Person person。還要在XML文件做相應(yīng)的設(shè)置,在Person實(shí)體的映射文件中加入:
一對(duì)多:就是兩個(gè)實(shí)體之間,一方實(shí)體的一個(gè)實(shí)例可以在另一實(shí)體中找到若干個(gè)與之對(duì)應(yīng)的實(shí)例,但另一方實(shí)體的一個(gè)實(shí)例卻只能對(duì)應(yīng)對(duì)方實(shí)體的一個(gè)實(shí)例。例如,在一個(gè)家庭中一對(duì)父母親可以生育多個(gè)子女,但每個(gè)子女卻都只能有一對(duì)父母親。
在具體實(shí)現(xiàn)中,需要在代表一方的父母實(shí)體 (Father) 類中引入一個(gè)Set集合屬性:private Set sons = new HashSet(0),作為與多方的關(guān)聯(lián)屬性;同時(shí)需要在代表多方的子女實(shí)體 (Son) 類中引入一個(gè)Father類型屬性:private Father father。最后需要在Father實(shí)體映射文件中配置: