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ík
je 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ík
primá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ík
primá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:
- Jeden k mnoha
- Mnoho ku jedné
- Mnoho k mnoha
- 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ík
s 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ýkon
s.