Úvod

V tomto výukovém kurzu se budeme věnovat Hibernate a Java Persistence API (JPA) – se zaměřením na rozdíly mezi nimi.

Začneme tím, že prozkoumáme, co je JPA, jak se používá a jaké jsou jeho základní koncepty.

Poté se podíváme na to, jak do něj zapadá Hibernate a EclipseLink.

Objektově-relační mapování

Než se ponoříme do JPA, je důležité pochopit koncept objektově-relačního mapování – známý také jako ORM.

Objektově-relační mapování je jednoduše proces persistence libovolného objektu jazyka Java přímo do tabulky databáze. Obvykle se název perzistovaného objektu stane názvem tabulky a každé pole v rámci tohoto objektu se stane sloupcem. S nastavenou tabulkou odpovídá každý řádek záznamu v aplikaci.

Úvod do JPA

Java Persistence API neboli JPA je specifikace, která definuje správu relačních dat v aplikaci Java. API mapuje sadu konceptů, které definují, které objekty v aplikaci by měly být perzistovány a jak by je měla perzistovat.

Je důležité poznamenat, že JPA je pouze specifikace a že ke svému fungování potřebuje implementaci – ale o tom až později.

Nyní si probereme některé základní koncepty JPA, které musí implementace pokrýt.

3.1. Entity

Třída javax.persistence.Entity definuje, které objekty mají být persistovány do databáze. Pro každou persistovanou entitu vytvoří JPA ve zvolené databázi novou tabulku.

Všechny zvolené entity by navíc měly definovat primární klíč označený anotací @Id. Spolu s anotací @GeneratedValue definujeme, že primární klíč by měl být automaticky vygenerován při perzistenci záznamu do databáze.

Podívejme se na rychlý příklad entity popsané pomocí JPA.

@Entitypublic class Car { @GeneratedValue @Id public long id; // getters and setters}

Pamatujte, že v současné době to nebude mít žádný vliv na aplikaci – JPA neposkytuje žádný implementační kód.

3.2. Persistence polí

Dalším základním konceptem JPA je persistence polí. Když je objekt v Javě definován jako entita, všechna pole v něm jsou automaticky perzistována jako různé sloupce v tabulce entit.

Pokud je v perzistovaném objektu pole, které nechceme perzistovat do databáze, můžeme toto pole deklarovat jako přechodné pomocí anotace @Transient.

3.3. Vztahy

Dále JPA specifikuje, jak bychom měli spravovat vztahy mezi různými databázovými tabulkami v rámci naší aplikace. Jak jsme viděli, JPA to řeší pomocí anotací. Existují čtyři anotace vztahů, které musíme mít na paměti:

  1. @OneToOne
  2. @OneToMany
  3. @ManyToOne
  4. @ManyToMany

Podívejme se, jak to funguje:

@Entitypublic class SteeringWheel { @OneToOne private Car car // getters and setters}

V našem příkladu výše popisuje třída SteeringWheel vztah jedna ku jedné s naší třídou Car z předchozího příkladu.

3.4. Správce entit

Nakonec třída javax.persistence.EntityManager specifikuje operace do databáze a z databáze. EntityManager obsahuje běžné operace Create, Read, Update a Delete (CRUD), které jsou persistovány do databáze.

Implementace JPA

Když máme ve specifikaci JPA definováno, jak a co máme persistovat, musíme nyní vybrat poskytovatele implementace, který dodá potřebný kód. Bez takového poskytovatele bychom museli implementovat všechny příslušné třídy, aby byly v souladu s JPA, a to je spousta práce!

Na výběr je spousta poskytovatelů, přičemž každý z nich vykazuje své výhody a nevýhody. Při rozhodování o tom, kterého použít, bychom měli zvážit několik následujících bodů:

  1. Zralost projektu – jak dlouho poskytovatel existuje a jak dobře je zdokumentován?
  2. Dílčí projekty – má poskytovatel nějaké užitečné dílčí projekty pro naši novou aplikaci?
  3. Komunitní podpora – existuje někdo, kdo nám pomůže, když skončíme s kritickou chybou?
  4. Benchmarking – jak výkonná je implementace?

Ačkoli se nebudeme do hloubky zabývat benchmarkingem různých poskytovatelů JPA, JPA Performance Benchmark (JPAB) obsahuje cenné poznatky v této oblasti.

Když to máme za sebou, pojďme se krátce podívat na některé z nejlepších poskytovatelů JPA.

Hibernate

V jádru je Hibernate nástroj pro objektově-relační mapování, který poskytuje implementaci JPA. Hibernate je jednou z nejvyspělejších implementací JPA s obrovskou komunitou, která tento projekt podporuje.

Implementuje všechny třídy javax.persistence, na které jsme se podívali dříve v článku, a také poskytuje funkce nad rámec JPA – nástroje Hibernate, validaci a vyhledávání. Ačkoli tato API specifická pro Hibernate mohou být užitečná, nejsou potřebná v aplikacích, které vyžadují pouze základní funkčnost JPA.

Podívejme se krátce na to, co Hibernate nabízí pomocí anotace @Entity.

Ačkoli splňuje kontrakt JPA, @org.hibernate.annotations.Entity přidává další metadata, která jdou nad rámec specifikace JPA. Tím umožňuje jemné doladění persistence entit. Podívejme se například na několik anotací nabízených systémem Hibernate, které rozšiřují funkčnost @Entity:

  1. @Table – umožňuje nám určit název tabulky vytvořené pro entitu
  2. @BatchSize – určuje velikost dávky při načítání entit z tabulky

Za zmínku stojí také několik dalších funkcí, které JPA nespecifikuje a které se mohou ukázat jako užitečné ve větších aplikacích:

  1. Přizpůsobitelné příkazy CRUD s anotacemi @SQLInsert, @SQLUpate a @SQLDelete
  2. Podpora měkkého mazání
  3. Immutabilní entity s anotací @Immutable

Pokud se chcete hlouběji seznámit s perzistencí Hibernate a Java, přejděte na náš výukový seriál Spring persistence.

EclipseLink

EclipseLink, vytvořený nadací Eclipse Foundation, poskytuje open-source implementaci JPA. Kromě toho EclipseLink podporuje řadu dalších standardů persistence, například Java Architecture for XML Binding (JAXB).

Zjednodušeně řečeno, namísto persistence objektu do řádku databáze jej JAXB mapuje do reprezentace XML.

Při porovnání stejné implementace anotace @Entity vidíme, že EclipseLink nabízí opět jiná rozšíření. Zatímco anotace @BatchSize, jak jsme viděli dříve, neexistuje, EclipseLink nabízí další možnosti, které Hibernate nemá.

Například:

  1. @ReadOnly – určuje, že persistovaná entita je určena pouze pro čtení
  2. @Struct – definuje třídu, která se má mapovat na databázový typ ‚struct‘

Chcete-li si přečíst více o tom, co EclipseLink nabízí, přejděte do našeho průvodce EclipseLink se Springem.

Závěr

V tomto článku jsme se zabývali rozhraním Java Persistence API neboli JPA

Nakonec jsme prozkoumali, jak se liší od rozhraní Hibernate a EclipseLink

.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.