specifikace Java Persistence API se týká vytrvalosti, což volně znamená, že jakýkoli mechanismus, který Java objekty přežít proces aplikace, který je vytvořil. Ne všechny objekty Java musí přetrvávat, ale většina aplikací přetrvává klíčové obchodní objekty. SPECIFIKACE JPA umožňuje definovat, které objekty by měly přetrvávat a jak by tyto objekty měly přetrvávat ve vašich Java aplikacích.
JPA sám o sobě není nástroj nebo rámec; spíše definuje soubor konceptů, které mohou být implementovány jakýmkoli nástrojem nebo rámcem. Zatímco objektově-relační mapování (ORM) model JPA byl původně založen na hibernaci, od té doby se vyvinul. Podobně, zatímco JPA byl původně určen pro použití s relačními / SQL databázemi, některé implementace JPA byly rozšířeny pro použití s NoSQL datastores. Populární rámec, který podporuje JPA s NoSQL je EclipseLink, referenční implementace pro JPA 2.2.
JPA a hibernace
kvůli jejich propletené historii jsou hibernace a JPA často spojeny. Nicméně, stejně jako SPECIFIKACE Java Servlet, JPA vytvořil mnoho kompatibilních nástrojů a rámců; hibernace je jen jedním z nich.
vyvinutý Gavinem Kingem a vydaný na začátku roku 2002, Hibernate je knihovna ORM pro Javu. King vyvinul Hibernate jako alternativu k entitě fazole pro vytrvalost. Rámec byl tak populární a v té době tak potřebný, že mnoho jeho myšlenek bylo přijato a kodifikováno v první specifikaci JPA.
dnes je hibernace ORM jednou z nejzralejších implementací JPA a stále populární volbou pro ORM v Javě. Hibernace ORM 5.3.8 (aktuální verze od tohoto psaní) implementuje JPA 2.2. Kromě toho se rodina nástrojů Hibernate rozšířila o populární nástroje jako Hibernate Search, Hibernate Validator a Hibernate OGM, které podporují perzistenci doménového modelu pro NoSQL.
co je Java ORM?
i když se liší v provedení, každá implementace JPA poskytuje nějaký druh ORM vrstvy. Abychom porozuměli nástrojům kompatibilním s JPA a JPA, musíte mít dobrý přehled o ORM.
objektově relační mapování je úkol-ten, který vývojáři mají dobrý důvod vyhnout se dělat ručně. Framework jako Hibernate ORM nebo EclipseLink kodifikuje tento úkol do knihovny nebo rámce, vrstvy ORM. V rámci aplikační architektury je vrstva ORM zodpovědná za správu převodu softwarových objektů za interakci s tabulkami a sloupci v relační databázi. V Javě vrstva ORM převádí třídy a objekty Java tak, aby mohly být uloženy a spravovány v relační databázi.
ve výchozím nastavení se název objektu, který přetrvává, stává názvem tabulky a pole se stávají sloupci. Jakmile je tabulka nastavena, každý řádek tabulky odpovídá objektu v aplikaci. Mapování objektů je konfigurovatelné, ale výchozí nastavení mají tendenci fungovat dobře.
Obrázek 1 ilustruje roli JPA a ORM vrstvy při vývoji aplikací.
Konfigurace Java ORM vrstvy
Při zakládání nového projektu používat JPA, budete muset nakonfigurovat datastore a JPA poskytovatele. Nakonfigurujete konektor datového úložiště pro připojení k vybrané databázi (SQL nebo NoSQL). Budete také zahrnovat a konfigurovat poskytovatele JPA, což je rámec, jako je hibernace nebo EclipseLink. I když můžete JPA konfigurovat ručně, mnoho vývojářů se rozhodlo použít podporu Spring out-of-the-box. Viz „Instalace a nastavení JPA“ níže pro ukázku ruční i jarní instalace a nastavení JPA.
perzistence dat v Javě
z programovacího hlediska je ORM vrstva adaptérovou vrstvou: 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.
při použití JPA vytvoříte mapu z datového úložiště k objektům datového modelu vaší aplikace. Místo toho, abyste definovali, jak jsou objekty ukládány a načteny, definujete mapování mezi objekty a databází a poté vyvoláte JPA, aby je přetrvávaly. Pokud používáte relační databáze, moc skutečné spojení mezi kód aplikace a databáze pak bude zpracována JDBC Java Database Connectivity API.
jako spec poskytuje JPA anotace metadat, které používáte k definování mapování mezi objekty a databází. Každá implementace JPA poskytuje svůj vlastní motor pro anotace JPA. SPS spec také poskytuje PersistanceManager
nebo EntityManager
, což jsou klíčové body kontaktu s SPS systém (kde vaše obchodní logiky kód sděluje systému, co dělat s mapovaných objektů).
Chcete-li to všechno 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ě
třída Musician
v seznamu 1 se používá k ukládání dat. Může obsahovat primitivní data, například pole Název. Může také držet vztahy k jiným třídám, jako je mainInstrument
a performances
.
Musician
důvodem pro bytí je obsahovat data. Tento typ třídy je někdy známý jako DTO nebo objekt pro přenos dat. Dtos jsou společným rysem vývoje softwaru. I když mají mnoho druhů dat, neobsahují žádnou obchodní logiku. Přetrvávající datové objekty jsou všudypřítomnou výzvou při vývoji softwaru.
trvalé úložiště Dat s JDBC
Jeden způsob, jak zachránit instance Musician
třídy do relační databáze by bylo použít JDBC knihovnu. JDBC je vrstva abstrakce, která umožňuje aplikaci vydávat příkazy SQL bez přemýšlení o základní implementaci databáze.
Výpis 2 ukazuje, jak byste mohli přetrvávat třídu Musician
pomocí JDBC.
Výpis 2. JDBC vložení záznamu
kód v seznamu 2 je poměrně samodokumentující. Objekt georgeHarrison
může pocházet odkudkoli (front-end submit, externí služba atd.), a má nastavená pole ID a název. Pole na objektu se pak použijí k zadání hodnot příkazu SQL insert
. (Třída PreparedStatement
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ý mapuje z Vašeho objektu Java tabulky v relační databázi. Poté musíte upravit SQL při každé změně podpisu objektu. S JDBC se udržování SQL stává úkolem samo o sobě.
perzistence dat s JPA
nyní zvažte Výpis 3, kde přetrváváme třídu Musician
pomocí JPA.
Výpis 3. Přetrvávající George Harrison s JPA
Musician georgeHarrison = new Musician(0, "George Harrison");musicianManager.save(georgeHarrison);
Výpis 3 nahrazuje manuální SQL z Výpisu 2 s jediný řádek, session.save()
, který pověřuje SPS přetrvávat objekt. Od té doby je konverze SQL zpracována rámcem, takže už nikdy nebudete muset opustit objektově orientované paradigma.
anotace metadat v JPA
kouzlo v seznamu 3 je výsledkem konfigurace, která je vytvořena pomocí anotací JPA. Vývojáři používají anotace k informování JPA, které objekty by měly přetrvávat a jak by měly přetrvávat.
Výpis 4 zobrazuje třídu Musician
s jedinou anotací JPA.
Výpis 4. JPA @Entity anotace
@Entitypublic class Musician { // ..class body}
perzistentní objekty se někdy nazývají entity. Připojení @Entity
ke třídě jako Musician
informuje JPA, že tato třída A její objekty by měly přetrvávat.
Konfigurace JPA
stejně Jako většina moderních rámců, SPS zahrnuje kódování podle úmluvy (také známý jako konvence nad konfigurací), v jehož rámci poskytuje výchozí konfiguraci založené na průmyslu osvědčené postupy. Jako jeden příklad, třída s názvem Musician
by být mapovány ve výchozím nastavení do databázové tabulky s názvem hudebník.
konvenční konfigurace je spořič času a v mnoha případech funguje dostatečně dobře. Je také možné přizpůsobit konfiguraci JPA. Jako příklad můžete použít JPA @Table
anotace k určení tabulky, kde by měla být uložena třída Musician
.
Výpis 5. SPS @Tabulky anotace
@Entity@Table(name="musician")public class Musician { // ..class body}
Výpis 5 říká, SPS přetrvávat subjektu (Musician
třídy) do musician
tabulka.
primární klíč
v JPA je primárním klíčem 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 vztahování objektů k jiným entitám. Kdykoli uložíte objekt do tabulky, určíte také pole, které chcete použít jako primární klíč.
v seznamu 6 řekneme JPA, jaké pole použít jako primární klíč Musician
.
Výpis 6. Určení primární klíč
@Entitypublic class Musician { @Id private Long id;
V tomto případě jsme použili SPS je @Id
anotace zadat id
pole Musician
‚je 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 nastaveno na automatický přírůstek v tabulce.
JPA podporuje další strategie pro generování primárního klíče objektu. Má také poznámky pro změnu jednotlivých názvů polí. Obecně je JPA dostatečně flexibilní, aby se přizpůsobila jakémukoli mapování vytrvalosti, které byste mohli potřebovat.
CRUD operace
Jakmile jste mapované třídy s databázovou tabulkou a stanovena její primární klíč, máte vše, co potřebujete vytvořit, načíst, odstranit a aktualizovat, že třída v databázi. Voláním session.save()
vytvoříte nebo aktualizujete zadanou třídu v závislosti na tom, zda je pole primárního klíče nulové nebo se vztahuje na existující entitu. Volání entityManager.remove()
odstraní zadanou třídu.
vztahy Entit v JPA
Jednoduše přetrvávající objekt s primitivní pole je jen polovina rovnice. JPA má také schopnost spravovat entity ve vztahu k sobě navzájem. V tabulkách i objektech jsou možné čtyři druhy vztahů entit:
- One-to-many
- Many-to-one
- One-to-one
každý typ vztahu popisuje, jak se entita vztahuje k jiným entitám. Například Musician
subjekt mohl mít one-to-many vztah s Performance
, účetní jednotka je zastoupena kolekce, například List
nebo Set
.
Pokud Musician
součástí Band
pole, vztah mezi těmito subjekty může být mnoho-to-one, což znamená, kolekce Musician
s na jeden Band
třídy. (Za předpokladu, že každý hudebník vystupuje pouze v jedné kapele.)
Pokud Musician
součástí BandMates
oblasti, které by mohly představovat mnoho-to-many vztah s ostatními Musician
subjekty.
a Konečně, Musician
může mít one-to-one vztah s Quote
subjekt, který se používá k reprezentaci slavný citát: Quote famousQuote = new Quote()
.
definování typů vztahů
JPA má anotace pro každý ze svých typů mapování vztahů. Výpis 7 ukazuje, jak může komentovat na one-to-many vztah mezi Musician
Performance
y.
Výpis 7. Anotace one-to-many vztah
Jedna věc, kterou musíte vědět, je, že @JoinColumn
říká, SPS, co sloupci na Výkon tabulka bude mapa do Musician
subjekt. Každý výkon bude přidružen k jedinému Musician
, který je sledován tímto sloupcem. Když JPA načte Musician
nebo Performance
do databáze, bude používat tyto informace k rekonstrukci objektu grafu.
načítání strategií v JPA
kromě toho, že JPA ví, kam umístit související entity do databáze, potřebuje vědět, jak je chcete načíst. Strategie načítání říkají JPA, jak načíst související entity. Při načítání a ukládání objektů, rámec JPA musí poskytnout možnost finetune, jak jsou zpracovány grafy objektů. Například, pokud Musician
class bandMate
pole (viz Výpis 7), zatížení george
může způsobit celou Hudebník tabulky, které mají být načteny z databáze!
Co je potřeba, je schopnost definovat líné načítání příbuzných entit-samozřejmě rozpoznávat, že vztahy v JPA mohou být dychtivé nebo líné. Poznámky můžete používat přizpůsobit svůj načítání strategie, ale SPS je výchozí konfigurace často funguje po vybalení z krabice, bez změny:
- Jeden-k-mnoha: Lazy
- Mnoho-to-one: Touží
- Mnoho-k-mnoha: Lazy
- Jeden-na-jednoho: Touží
JPA instalace a nastavení
Můžeme uzavřít s rychlý pohled na instalaci a nastavení SPS pro vaše Java aplikace. Pro tuto demonstraci použiji EclipseLink, referenční implementaci JPA.
běžným způsobem instalace JPA je zahrnutí poskytovatele JPA do vašeho projektu. Výpis 8 ukazuje, jak byste zahrnuli EclipseLink jako závislost do souboru Maven pom.xml
.
Výpis 8. Patří EclipseLink jako Maven závislost
org.eclipse.persistenceeclipselink2.5.0-RC1
Budete také muset obsahovat ovladač pro databázi, jak ukazuje Výpis 9.
Výpis 9. Maven závislost pro MySql konektor
mysqlmysql-connector-java5.1.32
Dále budete muset informovat systém o vaší databázi a poskytovateli. To se provádí v souboru persistence.xml
, jak je uvedeno v seznamu 10.
Výpis 10. Vytrvalost.xml
existují i jiné způsoby, jak tyto informace poskytnout systému, a to i programově. Doporučuji použít soubor persistence.xml
, protože ukládání závislostí tímto způsobem usnadňuje aktualizaci aplikace bez úpravy kódu.
konfigurace pružiny pro JPA
použití pružiny výrazně usnadní integraci JPA do vaší aplikace. Jako příklad, umístění @SpringBootApplication
anotace v aplikaci záhlaví pověřuje Jaře, aby se automaticky skenování pro třídy a aplikujte EntityManager
podle potřeby, na základě nastavení, které jste zadali.
Výpis 11 zobrazuje závislosti, které chcete zahrnout, pokud chcete podporu JPA pro vaši aplikaci.
Výpis 11. Přidání Spring JPA podporu v Maven
Závěr
Každá aplikace, která se zabývá databáze by měla definovat aplikační vrstvy, jejichž jediným účelem je izolovat kód vytrvalost. Jak jste viděli v tomto článku, Java Persistence API představuje řadu funkcí a podporu pro Java objekt persistence. Jednoduché aplikace nemusí vyžadovat všechny funkce JPA a v některých případech nemusí být režie konfigurace rámce zasloužena. Jak aplikace roste, struktura a zapouzdření JPA si však opravdu vydělávají. Použití JPA udržuje váš objektový kód jednoduchý a poskytuje konvenční rámec pro přístup k datům v Java aplikacích.
další informace o Java Persistence API a souvisejících technologiích
- co je JDBC? Úvod do Java Database Connectivity: seznamte se s nízkoúrovňovým API Java pro připojení k databázi, vydávání dotazů SQL a další.
- Java persistence s JPA a hibernace, Část 1: entity a vztahy: Začínáme modelování entit a vztahů s Java 8 a hibernace ORM.
- Java persistence s JPA a hibernace, Část 2: Praktické modelování mnoha až mnoha vztahů a dědičných vztahů v Javě 8 a hibernace ORM.
- implementace chování závislého na stavu: klasický úvod do stavového vzoru a závislosti stavu v Javě.
- Eager / Lazy Loading In Hibernate: jak aplikovat eager a lazy loading in Hibernate.
- JPA 2.2 přináší velmi očekávané změny: přehled aktualizací specifikací v JPA 2.2, včetně vylepšení CDI, lepší sladění s API data a času a podpora
@Repeatable
anotací. - měli byste použít JPA pro svůj další projekt?: Klíčové otázky, které vám mohou pomoci rozhodnout.