Programovanie

Čo je to JPA? Úvod do rozhrania Java Persistence API

Š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íkje 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íkprimá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íkprimá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:

    1. Jeden k mnohým
    2. Mnoho k jednému
    3. Mnoho k mnohým
    4. 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íks 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ýkons.

Výpis 7. Anotácia vzťahu jedna k mnohým

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