Programování

Co je to JPA? Úvod do rozhraní Java Persistence API

Specifikace se týká rozhraní Java Persistence API vytrvalost, což volně znamená jakýkoli mechanismus, kterým objekty Java přežijí aplikační proces, který je vytvořil. Ne všechny objekty Java je třeba zachovat, ale většina aplikací přetrvává klíčové obchodní objekty. Specifikace JPA vám umožňuje definovat který předměty by měly být trvalé, a jak tyto objekty by měly být ve vašich aplikacích Java trvalé.

JPA samo o sobě není nástrojem ani rámcem; spíše definuje sadu konceptů, které lze implementovat jakýmkoli nástrojem nebo rámcem. Zatímco model SPS objektově-relačního mapování (ORM) byl původně založen na režimu Hibernate, od té doby se vyvinul. Podobně, zatímco JPA bylo původně zamýšleno pro použití s ​​relačními / SQL databázemi, byly některé implementace JPA rozšířeny pro použití s ​​datovými úložišti NoSQL. Populární rámec, který podporuje JPA s NoSQL, je EclipseLink, referenční implementace pro JPA 2.2.

JPA 2.2 v Jakartě EE

Rozhraní Java Persistence API bylo poprvé vydáno jako podmnožina specifikace EJB 3.0 (JSR 220) v prostředí Java EE 5. Od té doby se vyvinulo jako jeho vlastní specifikace, počínaje vydáním JPA 2.0 v prostředí Java EE 6 (JSR 317). V době psaní tohoto článku bylo přijato JPA 2.2 pro pokračování jako součást Jakarta EE.

JPA a Hibernate

Hibernate a JPA jsou kvůli své propletené historii často sjednoceny. Stejně jako specifikace Java Servlet však JPA vytvořilo mnoho kompatibilních nástrojů a rámců; Hibernace je jen jedním z nich.

Hibernate, vyvinutý společností Gavin King a vydaný na začátku roku 2002, je knihovnou ORM pro Javu. King vyvinul Hibernate jako alternativu k fazole entity pro vytrvalost. Rámec byl v té době tak populární a tak potřebný, že mnoho jeho myšlenek bylo přijato a kodifikováno v první specifikaci SPS.

Dnes je Hibernate ORM jednou z nejzralejších implementací JPA a stále populární volbou pro ORM v Javě. Hibernate ORM 5.3.8 (aktuální verze tohoto psaní) implementuje JPA 2.2. Rodina nástrojů Hibernate se navíc rozšířila o oblíbené nástroje jako Hibernate Search, Hibernate Validator a Hibernate OGM, která podporuje vytrvalost doménového modelu pro NoSQL.

JPA a EJB

Jak již bylo uvedeno dříve, JPA bylo představeno jako podmnožina EJB 3.0, ale od té doby se vyvinulo jako jeho vlastní specifikace. EJB je specifikace s odlišným zaměřením od JPA a je implementována v kontejneru EJB. Každý kontejner EJB obsahuje vrstvu stálosti, která je definována specifikací JPA.

Co je Java ORM?

I když se liší v provedení, každá implementace JPA poskytuje nějaký druh vrstvy ORM. Abyste porozuměli JPA a nástrojům kompatibilním s JPA, musíte mít dobrý přehled o ORM.

Objektově-relační mapování je a úkol–Jeden, že vývojáři mají dobrý důvod, aby se vyhnuli ručnímu provádění. Rámec jako Hibernate ORM nebo EclipseLink kodifikuje tento úkol do knihovny nebo rámce, ORM vrstva. Jako součást aplikační architektury je vrstva ORM zodpovědná za správu převodu softwarových objektů k interakci s tabulkami a sloupci v relační databázi. V prostředí Java vrstva ORM převádí třídy a objekty Java tak, aby je bylo možné ukládat a spravovat v relační databázi.

Ve výchozím nastavení se název přetrvávajícího objektu stane názvem tabulky a pole se stanou sloupci. Jakmile je tabulka nastavena, odpovídá každý řádek tabulky objektu v aplikaci. Mapování objektů je konfigurovatelné, ale výchozí hodnoty obvykle fungují dobře.

JPA s NoSQL

Až donedávna byly nerelační databáze neobvyklými kuriozitami. Hnutí NoSQL to všechno změnilo a nyní jsou vývojářům Java k dispozici různé databáze NoSQL. Některé implementace JPA se vyvinuly tak, aby přijaly NoSQL, včetně Hibernate OGM a EclipseLink.

Obrázek 1 ilustruje roli JPA a vrstvy ORM při vývoji aplikace.

JavaWorld /

Konfigurace vrstvy Java ORM

Když nastavujete nový projekt pro použití JPA, budete muset nakonfigurovat úložiště dat a poskytovatele JPA. Nakonfigurujete a konektor úložiště dat pro připojení k vybrané databázi (SQL nebo NoSQL). Budete také zahrnovat a konfigurovat Poskytovatel JPA, což je rámec, jako je Hibernate nebo EclipseLink. I když můžete konfigurovat JPA ručně, mnoho vývojářů se rozhodlo použít podporu Spring's out-of-the-box. Viz „Instalace a nastavení JPA"níže je ukázka ruční i jarní instalace a nastavení JPA.

Datové objekty Java

Java Data Objects je standardizovaný rámec perzistence, který se liší od JPA především podporou logiky perzistence v objektu a jeho dlouhodobou podporou práce s nerelačními datovými úložišti. JPA a JDO jsou dostatečně podobné, že poskytovatelé JDO často také podporují JPA. V projektu Apache JDO se dozvíte více o JDO ve vztahu k dalším standardům perzistence, jako jsou JPA a JDBC.

Perzistence dat v Javě

Z hlediska programování je vrstva ORM vrstva adaptéru: přizpůsobuje jazyk objektových grafů jazyku SQL a relačních tabulek. Vrstva ORM umožňuje objektově orientovaným vývojářům vytvářet software, který přetrvává data, aniž by opustil objektově orientované paradigma.

Když používáte JPA, vytvoříte mapa z úložiště dat do objektů datového modelu vaší aplikace. Místo toho, abyste definovali, jak se objekty ukládají a načítají, definujete mapování mezi objekty a vaší databází a poté vyvoláte JPA, abyste je uchovali. Pokud používáte relační databázi, bude velká část skutečného připojení mezi kódem vaší aplikace a databází zpracována JDBC, rozhraním Java Database Connectivity API.

Jako specifikace poskytuje JPA anotace metadat, kterou používáte k definování mapování mezi objekty a databází. Každá implementace JPA poskytuje vlastní modul pro anotace JPA. Specifikace JPA také poskytuje PersistanceManager nebo EntityManager, což jsou klíčové body kontaktu se systémem JPA (kde váš kód obchodní logiky říká systému, co má dělat s mapovanými objekty).

Chcete-li to vše konkrétnější, zvažte Výpis 1, což je jednoduchá datová třída pro modelování hudebníka.

Výpis 1. Jednoduchá datová třída v Javě

 public class Musician {private Long id; soukromé jméno řetězce; soukromý nástroj mainInstrument; soukromé představení 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 (Instrument instr) {this.instrument = instr; } public Instrument getMainInstrument () {return this.instrument; } // ... Ostatní getry a settery ...} 

The Hudebník třída v seznamu 1 slouží k uchovávání dat. Může obsahovat primitivní data, jako je název pole. Může také udržovat vztahy s jinými třídami, jako je mainInstrument a představení.

Hudebníkje důvod pro bytí má obsahovat data. Tento typ třídy se někdy označuje jako DTO nebo objekt přenosu dat. DTO jsou běžnou součástí vývoje softwaru. I když obsahují mnoho druhů dat, neobsahují žádnou obchodní logiku. Přetrvávající datové objekty jsou všudypřítomnou výzvou při vývoji softwaru.

Perzistence dat s JDBC

Jedním ze způsobů uložení instance souboru Hudebník třída do relační databáze by bylo použít knihovnu JDBC. JDBC je vrstva abstrakce, která umožňuje aplikaci vydávat příkazy SQL bez přemýšlení o implementaci podkladové databáze.

Výpis 2 ukazuje, jak můžete přetrvávat Hudebník třída pomocí JDBC.

Výpis 2. Vložení záznamu JDBC

 Hudebník georgeHarrison = nový hudebník (0, „George Harrison“); Řetězec myDriver = "org.gjt.mm.mysql.Driver"; Řetězec myUrl = "jdbc: mysql: // localhost / test"; Class.forName (myDriver); Připojení conn = DriverManager.getConnection (myUrl, "root", ""); Řetězcový dotaz = "vložit do hodnot uživatelů (id, name) (?,?)"; PreparedStatement připravenýStmt = conn.prepareStatement (dotaz); readyStmt.setInt (1, 0); readyStmt.setString (2, „George Harrison“); readyStmt.setString (2, "Suť"); readyStmt.execute (); conn.close (); // Odebrání chyby kvůli stručnosti 

Kód v seznamu 2 je docela dokumentující. The George Harrison objekt může pocházet odkudkoli (odeslání front-endu, externí služba atd.) a má nastavená pole ID a jména. Pole na objektu se poté použijí k zadání hodnot SQL vložit prohlášení. (The Připravené prohlášení třída je součástí JDBC a nabízí způsob, jak bezpečně aplikovat hodnoty na dotaz SQL.)

Zatímco JDBC umožňuje ovládání, které je dodáváno s manuální konfigurací, je ve srovnání s JPA těžkopádné. Chcete-li upravit databázi, musíte nejprve vytvořit dotaz SQL, který se mapuje z vašeho objektu Java na tabulky v relační databázi. Poté budete muset upravit SQL při každé změně podpisu objektu. S JDBC se údržba SQL stává úkolem sama o sobě.

Perzistence dat s JPA

Nyní zvažte výpis 3, kde přetrváváme Hudebník třída pomocí JPA.

Výpis 3. Trvalý George Harrison s JPA

 Hudebník georgeHarrison = nový hudebník (0, „George Harrison“); musicianManager.save (georgeHarrison); 

Výpis 3 nahrazuje ruční SQL ze Výpisu 2 jediným řádkem, session.save (), který dává pokyn JPA přetrvávat objekt. Od té doby je převod SQL zpracováván frameworkem, takže nikdy nebudete muset opustit objektově orientované paradigma.

Anotace metadat v JPA

Kouzlo v seznamu 3 je výsledkem a konfigurace, který je vytvořen pomocí anotací SPS. Vývojáři pomocí anotací informují SPS, které objekty by měly být zachovány a jak by měly být zachovány.

Výpis 4 ukazuje Hudebník třída s jedinou anotací JPA.

Výpis 4. Anotace JPA @Entity

 @Entity Public Class Musician {// ..class body} 

Někdy se nazývají trvalé objekty subjekty. Připojování @Entity do třídy jako Hudebník informuje SPS, že tato třída a její objekty by měly být trvalé.

Konfigurace založená na XML vs. anotaci

SPS také podporuje použití externích souborů XML místo anotací k definování metadat třídy. Ale proč bys to dělal sám sobě?

Konfigurace JPA

Jako většina moderních rámců zahrnuje i JPA kódování konvencí (také známý jako konvence nad konfigurací), ve kterém rozhraní poskytuje výchozí konfiguraci na základě osvědčených postupů v oboru. Jako jeden příklad pojmenovaná třída Hudebník by byl standardně namapován na databázovou tabulku s názvem Hudebník.

Konvenční konfigurace šetří čas a v mnoha případech funguje dostatečně dobře. Je také možné přizpůsobit vaši konfiguraci JPA. Jako příklad můžete použít JPA @Stůl anotace k určení tabulky, kde Hudebník třída by měla být uložena.

Výpis 5. Anotace JPA @Table

 @Entity @Table (name = "musician") public class Musician {// ..class body} 

Výpis 5 říká, že JPA přetrvává v entitě (Hudebník třídy) do hudebník stůl.

Primární klíč

V JPA je primární klíč je pole používané k jednoznačné identifikaci každého objektu v databázi. Primární klíč je užitečný pro odkazování a související objekty s jinými entitami. Kdykoli uložíte objekt do tabulky, určíte také pole, které se má použít jako jeho primární klíč.

V seznamu 6 řekneme SPS, jaké pole použít Hudebníkprimární klíč.

Výpis 6. Specifikace primárního klíče

 @Entity public class musician {@Id private Long id; 

V tomto případě jsme použili JPA @Id anotace k upřesnění id pole jako Hudebníkprimární klíč. Ve výchozím nastavení tato konfigurace předpokládá, že primární klíč bude nastaven databází - například když je pole v tabulce nastaveno na automatický přírůstek.

SPS podporuje další strategie pro generování primárního klíče objektu. Má také poznámky ke změně názvů jednotlivých polí. Obecně je JPA dostatečně flexibilní, aby se přizpůsobilo jakémukoli mapování perzistence, které budete potřebovat.

Operace CRUD

Jakmile namapujete třídu na databázovou tabulku a vytvoříte její primární klíč, máte vše, co potřebujete k vytvoření, načtení, odstranění a aktualizaci dané třídy v databázi. Povolání session.save () vytvoří nebo aktualizuje zadanou třídu v závislosti na tom, zda je pole primárního klíče null nebo se vztahuje na existující entitu. Povolání entityManager.remove () odstraní zadanou třídu.

Vztahy mezi entitami v JPA

Pouhé přetrvávání objektu s primitivním polem je pouze polovina rovnice. SPS má také schopnost spravovat entity ve vztahu k sobě navzájem. V tabulkách i objektech jsou možné čtyři druhy vztahů entit:

    1. Jeden k mnoha
    2. Mnoho ku jedné
    3. Mnoho k mnoha
    4. Jeden na jednoho

Každý typ vztahu popisuje, jak se entita vztahuje k jiným entitám. Například Hudebník subjekt může mít a vztah jedna k více s Výkon, entita představovaná kolekcí, jako je Seznam nebo Soubor.

Pokud Hudebník zahrnuty a Kapela pole, vztah mezi těmito entitami může být více ku jedné, což znamená sbírku Hudebníks na singl Kapela třída. (Za předpokladu, že každý hudebník vystupuje pouze v jedné kapele.)

Li Hudebník zahrnuty a BandMates pole, které by mohlo představovat a vztah mnoho k mnoha s ostatními Hudebník subjekty.

Konečně, Hudebník může mít vztah jeden na jednoho s Citát entita, která představuje slavnou nabídku: Quote famousQuote = nový Quote ().

Definování typů vztahů

SPS má anotace pro každý ze svých typů mapování vztahů. Výpis 7 ukazuje, jak můžete anotovat vztah one-to-many mezi Hudebník a Výkons.

Výpis 7. Anotace vztahu jedna k mnoha