Špecifikáciou je Java Persistence API vytrvalosť, čo voľne znamená akýkoľvek mechanizmus, ktorým objekty Java prežijú aplikačný proces, ktorý ich vytvoril. Nie všetky objekty Java je potrebné udržiavať trvalo, ale väčšina aplikácií pretrváva v kľúčových obchodných objektoch. Špecifikácia JPA vám umožňuje definovať ktoré predmety by mali byť perzistentné a ako tieto objekty by mali vo vašich Java aplikáciách pretrvávať.
Samotné JPA nie je samo osebe nástrojom alebo rámcom; skôr definuje súbor konceptov, ktoré môžu byť implementované akýmkoľvek nástrojom alebo rámcom. Zatiaľ čo model JPA pre objektovo-relačné mapovanie (ORM) bol pôvodne založený na režime dlhodobého spánku, odvtedy sa vyvinul. Rovnako, zatiaľ čo JPA bolo pôvodne určené na použitie s relačnými / SQL databázami, niektoré implementácie JPA boli rozšírené na použitie s dátovými úložiskami NoSQL. Populárnym rámcom, ktorý podporuje JPA s NoSQL, je EclipseLink, referenčná implementácia pre JPA 2.2.
JPA 2.2 v Jakarte EE
Rozhranie Java Persistence API bolo prvýkrát vydané ako podmnožina špecifikácie EJB 3.0 (JSR 220) v prostredí Java EE 5. Od tej doby sa vyvinulo ako vlastná špecifikácia, počnúc vydaním JPA 2.0 v prostredí Java EE 6 (JSR 317). Od tohto písania bolo prijaté JPA 2.2 na pokračovanie ako súčasť Jakarty EE.
JPA a Hibernate
Hibernate a JPA sú kvôli svojej vzájomne prepojenej histórii často vzájomne prepojené. Rovnako ako špecifikácia Java Servlet však aj JPA prinieslo mnoho kompatibilných nástrojov a rámcov; Hibernate je len jedným z nich.
Hibernate, vyvinutý spoločnosťou Gavin King a uvedený na trh začiatkom roku 2002, je knižnicou ORM pre jazyk Java. King vyvinul Hibernate ako alternatívu k fazuli entity kvôli vytrvalosti. Rámec bol v tom čase taký populárny a tak potrebný, že veľa jeho myšlienok bolo prijatých a kodifikovaných v prvej špecifikácii JPA.
Dnes je Hibernate ORM jednou z najrozvinutejších implementácií JPA a stále je populárnou voľbou pre ORM v Jave. Hibernate ORM 5.3.8 (aktuálna verzia tohto písania) implementuje JPA 2.2. Rodina nástrojov Hibernate sa navyše rozšírila o populárne nástroje ako Hibernate Search, Hibernate Validator a Hibernate OGM, ktorá podporuje pretrvávanie doménových modelov pre NoSQL.
JPA a EJB
Ako už bolo spomenuté skôr, JPA bolo predstavené ako podmnožina EJB 3.0, ale odvtedy sa vyvinulo ako jeho vlastná špecifikácia. EJB je špecifikácia s iným zameraním ako JPA a je implementovaná v kontajneri EJB. Každý kontajner EJB obsahuje vrstvu perzistencie, ktorá je definovaná špecifikáciou JPA.
Čo je Java ORM?
Aj keď sa líšia v prevedení, každá implementácia JPA poskytuje určitý druh vrstvy ORM. Aby ste pochopili JPA a nástroje kompatibilné s JPA, musíte mať dobrý prehľad o ORM.
Objektovo-relačné mapovanie je a úloha–Človek, ktorý majú vývojári dobrý dôvod vyhnúť sa manuálnemu použitiu. Rámec ako Hibernate ORM alebo EclipseLink kodifikuje túto úlohu na knižnicu alebo rámec, Vrstva ORM. Ako súčasť aplikačnej architektúry je vrstva ORM zodpovedná za správu konverzie softvérových objektov na interakciu s tabuľkami a stĺpcami v relačnej databáze. V prostredí Java vrstva ORM prevádza triedy a objekty Java, aby ich bolo možné ukladať a spravovať v relačnej databáze.
V predvolenom nastavení sa názov pretrvávajúceho objektu stáva názvom tabuľky a polia sa stávajú stĺpcami. Po nastavení tabuľky každý riadok tabuľky zodpovedá objektu v aplikácii. Mapovanie objektov je konfigurovateľné, predvolené hodnoty však zvyčajne fungujú dobre.
JPA s NoSQL
Až donedávna boli nerelačné databázy neobvyklými kuriozitami. Hnutie NoSQL to všetko zmenilo a vývojárom Java sú teraz k dispozícii rôzne databázy NoSQL. Niektoré implementácie JPA sa vyvinuli tak, aby prijali NoSQL, vrátane Hibernate OGM a EclipseLink.
Obrázok 1 zobrazuje úlohu JPA a vrstvy ORM pri vývoji aplikácie.
JavaWorld /Konfigurácia vrstvy Java ORM
Keď nastavujete nový projekt na používanie JPA, budete musieť nakonfigurovať dátové úložisko a poskytovateľa JPA. Nakonfigurujete a konektor dátového úložiska na pripojenie k vybranej databáze (SQL alebo NoSQL). Zahrniete a nakonfigurujete aj Poskytovateľ JPA, čo je rámec ako Hibernate alebo EclipseLink. Aj keď môžete konfigurovať JPA manuálne, mnoho vývojárov sa rozhodlo využiť podporu Springu priamo z krabice. Pozri „Inštalácia a nastavenie JPA„nižšie na ukážku manuálnej aj jarnej inštalácie a nastavenia JPA.
Dátové objekty Java
Java Data Objects je štandardizovaný rámec perzistencie, ktorý sa líši od JPA predovšetkým podporou logiky perzistencie v objekte a dlhodobou podporou práce s nerelačnými dátovými skladmi. JPA a JDO sú si dosť podobné, aby poskytovatelia JDO často tiež podporovali JPA. V projekte Apache JDO sa dozviete viac o JDO vo vzťahu k iným štandardom perzistencie, ako sú JPA a JDBC.
Perzistencia údajov v Jave
Z hľadiska programovania je vrstva ORM vrstva adaptéra: prispôsobuje jazyk objektových grafov jazyku SQL a relačných tabuliek. Vrstva ORM umožňuje objektovo orientovaným vývojárom vytvárať softvér, ktorý pretrváva údaje bez toho, aby opustili objektovo orientovanú paradigmu.
Keď používate JPA, vytvoríte a mapa z úložiska dát do objektov dátových modelov vašej aplikácie. Namiesto definovania spôsobu ukladania a načítania objektov definujete mapovanie medzi objektmi a vašou databázou a potom vyvoláte JPA, aby ste ich zachovali. Ak používate relačnú databázu, veľkú časť skutočného spojenia medzi kódom vašej aplikácie a databázou potom spracuje JDBC, rozhranie Java Database Connectivity API.
Ako špecifikáciu poskytuje JPA anotácie metadát, pomocou ktorého definujete mapovanie medzi objektmi a databázou. Každá implementácia JPA poskytuje vlastný engine pre anotácie JPA. Špecifikácia JPA poskytuje aj PersistanceManager
alebo EntityManager
, ktoré sú kľúčovými bodmi kontaktu so systémom JPA (kde váš kód obchodnej logiky hovorí systému, čo má robiť s mapovanými objektmi).
Ak chcete toto všetko konkrétnejšie, zvážte zoznam 1, čo je jednoduchá dátová trieda na modelovanie hudobníka.
Zoznam 1. Jednoduchá dátová trieda v prostredí Java
public class Musician {private Long id; súkromné meno reťazca; private Instrument mainInstrument; súkromné vystúpenia ArrayList = nový ArrayList (); public Musician (Long id, String name) {/ * constructor setters ... * /} public void setName (String name) {this.name = name; } public String getName () {return this.name; } public void setMainInstrument (inštrument nástroja) {this.instrument = inštr; } public Instrument getMainInstrument () {return this.instrument; } // ... Ostatní zakladatelia a zakladatelia ...}
The Hudobník
trieda v zozname 1 slúži na uchovávanie údajov. Môže obsahovať primitívne údaje, ako napríklad názov lúka. Môže tiež udržiavať vzťahy s inými triedami, ako sú napr mainInstrument
a predstavenia
.
Hudobník
je dôvod bytia má obsahovať údaje. Tento typ triedy je niekedy známy ako DTO alebo objekt prenosu dát. DTO sú bežnou vlastnosťou vývoja softvéru. Aj keď obsahujú veľa druhov údajov, neobsahujú žiadnu obchodnú logiku. Pretrvávajúce dátové objekty sú všadeprítomnou výzvou pri vývoji softvéru.
Perzistencia údajov s JDBC
Jedným zo spôsobov, ako uložiť inštanciu súboru Hudobník
triedy do relačnej databázy by bolo použitie knižnice JDBC. JDBC je vrstva abstrakcie, ktorá umožňuje aplikácii vydávať príkazy SQL bez premýšľania o implementácii základnej databázy.
Zoznam 2 ukazuje, ako by ste mohli pretrvávať Hudobník
triedy pomocou JDBC.
Výpis 2. Vloženie záznamu JDBC
Hudobník georgeHarrison = nový hudobník (0, „George Harrison“); Reťazec myDriver = "org.gjt.mm.mysql.Driver"; Reťazec myUrl = "jdbc: mysql: // localhost / test"; Class.forName (myDriver); Pripojenie conn = DriverManager.getConnection (myUrl, "root", ""); Reťazec query = "vložiť do používateľov (id, meno) hodnoty (?,?)"; PreparedStatement ReadyStmt = conn.prepareStatement (dopyt); readyStmt.setInt (1, 0); readyStmt.setString (2, „George Harrison“); readyStmt.setString (2, „Suť“); readyStmt.execute (); conn.close (); // Odstránenie chyby bolo kvôli stručnosti odstránené
Kód v zozname 2 je dosť dokumentačný. The georgeHarrison
objekt môže pochádzať odkiaľkoľvek (odosielanie front-end, externá služba atď.) a má nastavené polia ID a name. Polia na objekte sa potom použijú na dodanie hodnôt SQL vložiť
vyhlásenie. (The Pripravené vyhlásenie
je súčasťou JDBC a ponúka spôsob, ako bezpečne použiť hodnoty na dotaz SQL.)
Aj keď JDBC umožňuje ovládanie dodávané s manuálnou konfiguráciou, je to v porovnaní s JPA ťažkopádne. Ak chcete upraviť databázu, musíte najskôr vytvoriť dotaz SQL, ktorý sa mapuje z vášho objektu Java na tabuľky v relačnej databáze. Potom budete musieť upraviť SQL pri každej zmene podpisu objektu. S JDBC sa údržba SQL stáva úlohou sama o sebe.
Perzistencia údajov s JPA
Teraz zvážte zoznam 3, kde pretrvávame Hudobník
triedy pomocou JPA.
Zoznam 3. Trvalý George Harrison v rámci JPA
Hudobník georgeHarrison = nový hudobník (0, „George Harrison“); musicianManager.save (georgeHarrison);
Výpis 3 nahrádza manuálny SQL zo Výpisu 2 jediným riadkom, session.save ()
, ktorý dáva pokyn JPA, aby v objekte vydržalo. Od tej doby je konverzia SQL riešená rámcom, takže už nikdy nemusíte opustiť objektovo orientovanú paradigmu.
Anotácie metadát v JPA
Kúzlo v zozname 3 je výsledkom a konfigurácia, ktorý je vytvorený pomocou anotácií JPA. Vývojári pomocou anotácií informujú JPA, ktoré objekty by sa mali zachovať a ako by sa mali zachovať.
Výpis 4 zobrazuje Hudobník
triedy s jedinou anotáciou JPA.
Výpis 4. Anotácia JPA @Entity
@Entity Public Class Musician {// ..class body}
Niekedy sa nazývajú trvalé objekty subjekty. Pripája sa @Entity
do triedy ako Hudobník
informuje JPA, že táto trieda a jej objekty by mali byť zachované.
Konfigurácia založená na XML vs. anotáciách
Spoločné parlamentné zhromaždenie taktiež podporuje použitie externých súborov XML na definovanie metaúdajov triedy namiesto anotácií. Prečo by ste to však robili sami sebe?
Konfigurácia JPA
Rovnako ako väčšina moderných rámcov, aj JPA zahŕňa kódovanie dohovorom (tiež známy ako dohovor nad konfiguráciou), v ktorom rámec poskytuje predvolenú konfiguráciu na základe najlepších postupov v odbore. Ako jeden príklad môžeme uviesť triedu Hudobník
by sa štandardne namapoval na databázovú tabuľku s názvom Hudobník.
Bežná konfigurácia šetrí čas a v mnohých prípadoch funguje dosť dobre. Je tiež možné prispôsobiť vašu konfiguráciu JPA. Ako príklad môžete použiť súbory JPA @ Tabuľka
anotácia na určenie tabuľky, kde Hudobník
trieda by mala byť uložená.
Výpis 5. Anotácia @Table JPA
@Entity @Table (name = "musician") public class Musician {// ..class body}
Zoznam 5 hovorí, že JPA má pretrvávať v entite (Hudobník
triedy) do hudobník
stôl.
Primárny kľúč
V JPA sa primárny kľúč je pole používané na jednoznačnú identifikáciu každého objektu v databáze. Primárny kľúč je užitočný na odkazovanie a spájanie objektov s inými entitami. Kedykoľvek uložíte objekt do tabuľky, určíte tiež pole, ktoré sa má použiť ako jeho primárny kľúč.
V zozname 6 povieme JPA, aké pole sa má použiť Hudobník
primárny kľúč.
Zoznam 6. Zadanie primárneho kľúča
@Entity public class musician {@Id private Long id;
V tomto prípade sme použili JPA @Id
anotácia na upresnenie id
pole ako Hudobník
primárny kľúč. Táto konfigurácia predvolene predpokladá, že primárny kľúč bude nastavený databázou - napríklad keď je pole v tabuľke nastavené na automatický prírastok.
JPA podporuje ďalšie stratégie na generovanie primárneho kľúča objektu. Obsahuje tiež poznámky k zmene názvov jednotlivých polí. Všeobecne je JPA dostatočne flexibilné na to, aby sa dalo prispôsobiť každému mapovaniu perzistencie, ktoré budete potrebovať.
Operácie CRUD
Po namapovaní triedy na databázovú tabuľku a vytvorení jej primárneho kľúča máte všetko, čo potrebujete na vytvorenie, získanie, odstránenie a aktualizáciu tejto triedy v databáze. Telefonovanie session.save ()
vytvorí alebo aktualizuje zadanú triedu v závislosti od toho, či je pole primárneho kľúča nulové alebo či sa vzťahuje na existujúcu entitu. Telefonovanie entityManager.remove ()
vymaže zadanú triedu.
Vzťahy entít v JPA
Jednoduché pretrvávanie objektu s primitívnym poľom je iba polovica rovnice. Spoločné parlamentné zhromaždenie má tiež schopnosť vzájomne spravovať subjekty. V tabuľkách aj objektoch sú možné štyri druhy vzťahov entít:
- Jeden k mnohým
- Mnoho k jednému
- Mnoho k mnohým
- Jeden na jedného
Každý typ vzťahu popisuje, ako entita súvisí s inými entitami. Napríklad Hudobník
subjekt mohol mať a vzťah one-to-many s Výkon
, subjekt zastúpený zbierkou ako napr Zoznam
alebo Nastaviť
.
Ak Hudobník
vrátane a Kapela
oblasti, vzťah medzi týmito entitami môže byť mnoho-k-jednému, z čoho vyplýva zbierka Hudobník
s na single Kapela
trieda. (Za predpokladu, že každý hudobník vystupuje iba v jednej kapele.)
Ak Hudobník
vrátane a BandMates
pole, ktoré by mohlo predstavovať a vzťah veľa k mnohým s iným Hudobník
subjekty.
Nakoniec Hudobník
môže mať vzťah jeden na jedného s Citát
subjekt, ktorý predstavuje slávnu citáciu: Quote famousQuote = nový Quote ()
.
Definovanie typov vzťahov
JPA má anotácie pre každý zo svojich typov mapovania vzťahov. Zoznam 7 ukazuje, ako by ste mohli anotovať vzťah medzi mnohými Hudobník
a Výkon
s.