Programiranje

Kaj je JPA? Uvod v API za obstojnost Java

Kot specifikacija se ukvarja API za obstojnost Java vztrajnost, kar ohlapno pomeni kateri koli mehanizem, s katerim predmeti Java nadživijo aplikacijski proces, ki jih je ustvaril. Ni treba ohraniti vseh predmetov Java, vendar večina aplikacij ohranja ključne poslovne predmete. Specifikacija JPA vam omogoča definiranje ki predmete je treba vztrajati in kako te predmete je treba ohraniti v vaših aplikacijah Java.

SPS sama po sebi ni orodje ali okvir; namesto tega opredeljuje nabor konceptov, ki jih lahko izvaja katero koli orodje ali ogrodje. Medtem ko je model objektno-relacijskega preslikavanja (ORM) JPA prvotno temeljil na hibernaciji, se je od takrat razvil. Podobno, čeprav je bila JPA prvotno namenjena za uporabo z relacijskimi bazami podatkovnih baz / SQL, so bile nekatere izvedbe JPA razširjene za uporabo s podatkovnimi shrambami NoSQL. Priljubljen okvir, ki podpira JPA z NoSQL, je EclipseLink, referenčna izvedba za JPA 2.2.

JPA 2.2 v Džakarti EE

API za obstojnost Java je bil prvič izdan kot podnabor specifikacije EJB 3.0 (JSR 220) v Javi EE 5. Od takrat se je razvil kot lastna specifikacija, začenši z izdajo JPA 2.0 v Javi EE 6 (JSR 317). Od tega pisanja je bil JPA 2.2 sprejet za nadaljevanje kot del Jakarta EE.

JPA in mirovanje

Hibernate in JPA se zaradi svoje prepletene zgodovine pogosto prepletata. Vendar je JPA, tako kot specifikacija Java Servlet, ustvarila številna združljiva orodja in okvire; Hibernate je le eden izmed njih.

Hibernate, ki ga je razvil Gavin King in je izšel v začetku leta 2002, je knjižnica ORM za Javo. King je razvil Hibernate kot alternativo entitetnim fižolom za vztrajnost. Okvir je bil takrat tako priljubljen in tako potreben, da so bile številne njegove ideje sprejete in kodificirane v prvi specifikaciji JPA.

Danes je Hibernate ORM ena najbolj zrelih implementacij JPA in še vedno priljubljena možnost za ORM v Javi. Hibernate ORM 5.3.8 (trenutna različica tega pisanja) izvaja JPA 2.2. Družina orodij Hibernate se je razširila na priljubljena orodja, kot so Hibernate Search, Hibernate Validator in Hibernate OGM, ki podpira obstojnost domenskega modela za NoSQL.

JPA in EJB

Kot smo že omenili, je bila JPA uvedena kot podskupina EJB 3.0, vendar se je od takrat razvila kot lastna specifikacija. EJB je specifikacija z drugačnim poudarkom kot JPA in je implementirana v vsebnik EJB. Vsak vsebnik EJB vključuje plast obstojnosti, ki je opredeljena v specifikaciji JPA.

Kaj je Java ORM?

Čeprav se razlikujejo po izvedbi, vsaka izvedba JPA zagotavlja nekakšen sloj ORM. Da bi razumeli orodja JPA in JPA-združljiva, morate dobro razumeti ORM.

Predmetno-relacijsko preslikavanje je a naloga- tisti, za katerega se razvijalci utemeljeno izogibajo ročnemu izvajanju Okvir, kot je Hibernate ORM ali EclipseLink, to nalogo kodificira v knjižnico ali ogrodje, Sloj ORM. Kot del arhitekture aplikacije je sloj ORM odgovoren za upravljanje pretvorbe programskih predmetov za interakcijo s tabelami in stolpci v relacijski bazi podatkov. V Javi plast ORM pretvori razrede in predmete Java, tako da jih je mogoče shraniti in upravljati v relacijski bazi podatkov.

Privzeto ime predmeta, ki se vztraja, postane ime tabele, polja pa stolpci. Ko je tabela nastavljena, vsaka vrstica tabele ustreza predmetu v aplikaciji. Preslikavo objektov je mogoče konfigurirati, vendar privzete vrednosti ponavadi dobro delujejo.

JPA z NoSQL

Do nedavnega so bile nerelacijske zbirke podatkov neobičajna zanimivost. Gibanje NoSQL je vse to spremenilo in zdaj so razvijalci Jave na voljo številne zbirke podatkov NoSQL. Nekatere izvedbe JPA so se razvile tako, da zajemajo NoSQL, vključno s Hibernate OGM in EclipseLink.

Slika 1 prikazuje vlogo JPA in sloja ORM pri razvoju aplikacij.

JavaWorld /

Konfiguriranje sloja Java ORM

Ko nastavite nov projekt za uporabo JPA, boste morali konfigurirati shrambo podatkov in ponudnika JPA. Konfigurirali boste a priključek shrambe podatkov za povezavo z izbrano bazo podatkov (SQL ali NoSQL). Vključili in konfigurirali boste tudi Ponudnik JPA, ki je ogrodje, kot sta Hibernate ali EclipseLink. Čeprav lahko JPA konfigurirate ročno, se mnogi razvijalci odločijo za uporabo Spring-jeve neposredne podpore. Glej "Namestitev in namestitev JPA"spodaj za predstavitev ročne namestitve in namestitve in nastavitve JPA na osnovi Spring.

Java Data Objects

Java Data Objects je standardiziran okvir trajnosti, ki se od JPA razlikuje predvsem po podpori logike trajnosti v objektu in po dolgotrajni podpori za delo z nerelacijskimi shrambami podatkov. JPA in JDO sta si dovolj podobna, da ponudniki JDO pogosto podpirajo tudi JPA. Oglejte si projekt Apache JDO, če želite izvedeti več o JDO v povezavi z drugimi standardi obstojnosti, kot sta JPA in JDBC.

Vztrajnost podatkov v Javi

S programskega vidika je plast ORM vmesni sloj: jezik objektnih grafov prilagodi jeziku SQL in relacijskih tabel. Sloj ORM omogoča objektno usmerjenim razvijalcem, da izdelajo programsko opremo, ki ohranja podatke, ne da bi kdaj zapustili objektno usmerjeno paradigmo.

Ko uporabljate JPA, ustvarite zemljevid od shrambe podatkov do predmetov podatkovnega modela vaše aplikacije. Namesto da definirate, kako se predmeti shranjujejo in pridobivajo, definirate preslikavo med predmeti in vašo bazo podatkov, nato pa prikličete JPA, da jih vztraja. Če uporabljate relacijsko bazo podatkov, bo večino dejanske povezave med kodo vaše aplikacije in bazo podatkov obdelal JDBC, Java Database Connectivity API.

Kot specifikacija zagotavlja JPA pripisi metapodatkov, ki ga uporabljate za določanje preslikave med predmeti in bazo podatkov. Vsaka izvedba JPA ponuja svoj mehanizem za pripise JPA. Specifikacija JPA vsebuje tudi PersistanceManager ali EntityManager, ki so ključne kontaktne točke s sistemom JPA (pri čemer vaša poslovna logična koda sistemu sporoča, kaj naj stori s preslikanimi predmeti).

Da bi vse to postalo bolj konkretno, si oglejte seznam 1, ki je preprost podatkovni razred za modeliranje glasbenika.

Seznam 1. Preprost podatkovni razred v Javi

 glasbenik iz javnega razreda {private Long id; ime zasebnega niza; zasebni instrument mainInstrument; zasebne predstave ArrayList = novi ArrayList (); javni glasbenik (dolg id, ime niza) {/ * ustanovitelji konstruktorja ... * /} javna praznina setName (ime niza) {this.name = name; } javni niz getName () {return this.name; } public void setMainInstrument (Instrument instr) {this.instrument = instr; } javni instrument getMainInstrument () {return this.instrument; } // ... Drugi pridobivalci in nastavitelji ...} 

The Glasbenik razred na seznamu 1 se uporablja za hrambo podatkov. Vsebuje lahko primitivne podatke, kot je ime polje. Lahko ima tudi odnose z drugimi razredi, kot je mainInstrument in predstave.

Glasbenikje razlog za to vsebuje podatke. Ta vrsta razreda je včasih znana tudi kot DTO ali predmet prenosa podatkov. DTO so pogosta značilnost razvoja programske opreme. Čeprav hranijo veliko vrst podatkov, ne vsebujejo nobene poslovne logike. Vztrajanje podatkovnih predmetov je vseprisotni izziv pri razvoju programske opreme.

Vztrajanje podatkov pri JDBC

Eden od načinov za shranjevanje primerka Glasbenik razreda relacijske baze podatkov bi bila uporaba knjižnice JDBC. JDBC je plast abstrakcije, ki aplikaciji omogoča izdajanje ukazov SQL, ne da bi razmišljala o osnovni izvedbi baze podatkov.

Seznam 2 prikazuje, kako lahko vztrajate Glasbenik razred z uporabo JDBC.

Seznam 2. JDBC vstavlja zapis

 Glasbenik georgeHarrison = novi glasbenik (0, "George Harrison"); Niz myDriver = "org.gjt.mm.mysql.Driver"; Niz myUrl = "jdbc: mysql: // localhost / test"; Class.forName (myDriver); Povezava conn = DriverManager.getConnection (myUrl, "root", ""); String query = "vstavi v vrednosti uporabnikov (id, ime) (?,?)"; PreparedStatement PrepaStmt = conn.prepareStatement (poizvedba); PreparedStmt.setInt (1, 0); pripravljenStmt.setString (2, "George Harrison"); PrepaStmt.setString (2, "Rubble"); pripravljenStmt.execute (); conn.close (); // Odstranjena napaka zaradi kratkosti 

Koda iz seznama 2 je dokaj samo-dokumentirajoča. The georgeHarrison objekt lahko prihaja od koder koli (prednji del, zunanja storitev itd.) in ima nastavljena polja ID in ime. Nato se polja na objektu uporabljajo za podajanje vrednosti SQL vstavi izjavo. (The PreparedStatement class je del JDBC in ponuja način za varno uporabo vrednosti v poizvedbi SQL.)

JDBC sicer omogoča nadzor z ročno konfiguracijo, vendar je v primerjavi z JPA okoren. Če želite spremeniti bazo podatkov, morate najprej ustvariti poizvedbo SQL, ki iz vašega predmeta Java preslika v tabele v relacijski bazi podatkov. Nato morate SQL spremeniti vsakič, ko se spremeni podpis predmeta. Z JDBC postane vzdrževanje SQL samo po sebi naloga.

Vztrajanje podatkov pri JPA

Zdaj razmislite o seznamu 3, kjer vztrajamo na Glasbenik razred z uporabo JPA.

Seznam 3. Vztrajanje Georgea Harrisona pri JPA

 Glasbenik georgeHarrison = novi glasbenik (0, "George Harrison"); musicianManager.save (georgeHarrison); 

Seznam 3 nadomesti ročni SQL iz seznama 2 z eno vrstico, session.save (), ki JPA naroči, naj vztraja na predmetu. Od takrat naprej pretvorbo SQL ureja ogrodje, zato vam nikoli ni treba zapustiti objektno usmerjene paradigme.

Pripisi metapodatkov v JPA

Čarovnija v seznamu 3 je rezultat a konfiguracijo, ki je ustvarjen z uporabo pripisov JPA. Razvijalci s pripisi obveščajo JPA, katere predmete je treba ohraniti in kako jih je treba ohraniti.

Seznam 4 prikazuje Glasbenik razred z enim pripisom JPA.

Seznam 4. Pripis JPA @Entity

 Glasbenik iz javnega razreda @Entity {// ..class body} 

Včasih se imenujejo trajni predmeti subjekti. Pritrditev @Entiteta v razred, kot je Glasbenik obvešča JPA, da je treba ta razred in njegove predmete ohraniti.

XML v primerjavi s konfiguracijo, ki temelji na pripisih

JPA podpira tudi uporabo zunanjih datotek XML namesto pripisov za določanje metapodatkov razreda. Zakaj pa bi si to naredil?

Konfiguriranje JPA

Kot večina sodobnih okvirov tudi JPA zajema kodiranje po dogovoru (znan tudi kot dogovor o konfiguraciji), v katerem ogrodje zagotavlja privzeto konfiguracijo, ki temelji na najboljših praksah v industriji. Kot primer lahko navedemo razred z imenom Glasbenik bi bil privzeto preslikan v tabelo baze podatkov, imenovano Glasbenik.

Običajna konfiguracija prihrani čas in v mnogih primerih deluje dovolj dobro. Konfiguracijo JPA lahko tudi prilagodite. Kot primer lahko uporabite JPA @Table , da določite tabelo, v kateri je Glasbenik razred je treba shraniti.

Seznam 5. Pripis JPA @Table

 @Entity @Table (name = "musician") glasbenik javnega razreda {// ..class body} 

Seznam 5 JPA sporoča, naj vztraja pri entiteti (Glasbenik razred) do glasbenik tabela.

Primarni ključ

V JPA je primarni ključ je polje, ki se uporablja za enolično identifikacijo vsakega predmeta v bazi podatkov. Primarni ključ je uporaben za sklicevanje in povezovanje predmetov z drugimi entitetami. Kadarkoli shranite predmet v tabelo, boste določili tudi polje, ki ga želite uporabiti kot primarni ključ.

V seznamu 6 povemo JPA, katero polje uporabiti Glasbenikje glavni ključ.

Seznam 6. Določitev primarnega ključa

 @ Entity javni glasbenik {@Id private Long id; 

V tem primeru smo uporabili JPA @Id , da določite id polje kot Glasbenikje glavni ključ. Ta konfiguracija privzeto predvideva, da bo primarni ključ nastavila baza podatkov - na primer, ko je polje nastavljeno na samodejni prirastek v tabeli.

JPA podpira druge strategije za ustvarjanje primarnega ključa predmeta. Ima tudi pripise za spreminjanje posameznih imen polj. Na splošno je JPA dovolj prilagodljiv, da se lahko prilagodi kakršnemu koli načrtu vztrajnosti, ki ga boste morda potrebovali.

CRUD operacije

Ko ste razred preslikali v tabelo zbirke podatkov in vzpostavili njegov primarni ključ, imate v bazi vse, kar potrebujete za ustvarjanje, pridobivanje, brisanje in posodobitev tega razreda. Klicanje session.save () bo ustvaril ali posodobil navedeni razred, odvisno od tega, ali je polje primarnega ključa nič ali velja za obstoječo entiteto. Klicanje entityManager.remove () bo izbrisal navedeni razred.

Entitetni odnosi v JPA

Preprosto vztrajanje predmeta s primitivnim poljem je le polovica enačbe. JPA ima tudi sposobnost upravljanja entitet medsebojno. V tabelah in objektih so možne štiri vrste odnosov entitet:

    1. Eden proti številnim
    2. Mnogo do enega
    3. Mnogo do mnogih
    4. Ena na ena

Vsaka vrsta odnosa opisuje, kako se entiteta naveže na druge entitete. Na primer Glasbenik entiteta bi lahko imela odnos ena proti številnim s Izvedba, subjekt, ki ga zastopa zbirka, kot je Seznam ali Nastavite.

Če je Glasbenik vključeni a Band razmerje med temi entitetami lahko mnogo na enega, kar pomeni zbiranje Glasbeniks na singlu Band razred. (Ob predpostavki, da vsak glasbenik nastopa samo v enem pasu.)

Če Glasbenik vključeni a BandMates polje, ki bi lahko predstavljalo razmerje med mnogimi in mnogimi z drugimi Glasbenik subjekti.

Končno, Glasbenik morda imajo odnos ena na ena z Kvota entiteta, ki se uporablja za predstavitev slavnega citata: Citat knownQuote = nov citat ().

Določanje vrst odnosov

JPA ima pripise za vsako od svojih vrst preslikave odnosov. Seznam 7 prikazuje, kako lahko označite razmerje med številkami Glasbenik in Izvedbas.

Seznam 7. Označevanje razmerja ena proti več

$config[zx-auto] not found$config[zx-overlay] not found