Sprievodca po Hibernate EntityManager

1. Úvod

EntityManager je súčasťou Java Persistence API. Hlavne implementuje programovacie rozhrania a pravidlá životného cyklu definované v špecifikácii JPA 2.0.

Okrem toho môžeme získať prístup k Perzistenčnému kontextu pomocou rozhraní API v EntityManager.

V tomto výučbe sa pozrieme na konfiguráciu, typy a rôzne API rozhrania EntityManager.

2. Maven závislosti

Najprv musíme zahrnúť závislosti režimu dlhodobého spánku:

 org.hibernate hibernate-core 5.4.0.Final 

Budeme tiež musieť zahrnúť závislosti ovládačov v závislosti od databázy, ktorú používame:

 mysql mysql-konektor-java 8.0.13 

Závislosti hibernácie a mysql-konektor-java sú k dispozícii na serveri Maven Central.

3. Konfigurácia

Teraz si ukážeme EntityManager, použitím a Film entita, ktorá zodpovedá tabuľke MOVIE v databáze.

V priebehu tohto článku budeme využívať EntityManager API na prácu s Film objekty v databáze.

3.1. Definovanie entity

Začnime tým, že vytvoríme entitu zodpovedajúcu tabuľke MOVIE pomocou príkazu @Entity anotácia:

@Entity @Table (name = "MOVIE") public class Movie {@Id private Long id; private String movieName; súkromné ​​vydanie celého číslaRok; súkromný reťazcový jazyk; // štandardný konštruktor, getre, setre}

3.2. The persistence.xml Súbor

Keď EntityManagerFactory je vytvorený, implementácia vytrvalosti hľadá META-INF / persistence.xml súbor v triede.

Tento súbor obsahuje konfiguráciu súboru EntityManager:

 Hibernate EntityManager Demo com.baeldung.hibernate.pojo.Film true 

Na vysvetlenie definujeme jednotku perzistencie, ktorá určuje základné dátové úložisko spravované serverom EntityManager.

Ďalej definujeme dialekt a ďalšie vlastnosti JDBC podkladového dátového skladu. Hibernácia je databázovo-agnostická. Na základe týchto vlastností sa režim dlhodobého spánku pripája k základnej databáze.

4. Kontajner a spravovaná aplikácia EntityManager

V podstate existujú dva typy EntityManager: Spravované kontajnermi a spravované aplikáciami.

Pozrime sa podrobnejšie na každý typ.

4.1. Spravované kontajnerom EntityManager

Tu nádoba vstrekuje EntityManager v našich podnikových komponentoch.

Inými slovami, kontajner vytvára EntityManager z EntityManagerFactory pre nás:

@PersistenceContext EntityManager entityManager; 

To tiež znamená kontajner je zodpovedný za začatie transakcie, ako aj za jej vykonanie alebo vrátenie späť.

Podobne je kontajner zodpovedný za uzatvorenie EntityManager, takže je bezpečné ho používaťbez ručného čistenia. Aj keď sa o to pokúsime zavrieť a spravovaný kontajnerom EntityManager, malo by to hodiť IllegalStateException.

4.2. Spravované aplikáciou EntityManager

Naopak, životný cyklus systému EntityManager je spravovaná aplikáciou tu.

V skutočnosti ručne vytvoríme EntityManager. Ďalej budeme tiež riadiť životný cyklus EntityManager sme vytvorili.

Najskôr vytvorme EntityManagerFactory:

EntityManagerFactory emf = Persistence.createEntityManagerFactory ("com.baeldung.movie_catalog");

Za účelom vytvorenia EntityManager, musíme výslovne zavolať createEntityManager () v EntityManagerFactory:

public static EntityManager getEntityManager () {return emf.createEntityManager (); }

Pretože sme zodpovední za tvorbu EntityManager inštanciách je tiež našou zodpovednosťou ich uzavrieť. Preto by sme mali Zavrieť každý EntityManager keď ich skončíme.

4.3. Bezpečnosť závitov

The EntityManagerFactory prípadoch a následne aj režimu dlhodobého spánku SessionFactory inštancie, sú bezpečné pre vlákna. V súbežných kontextoch je teda úplne bezpečné písať:

EntityManagerFactory emf = // načítané odkiaľkoľvek EntityManager em = emf.createEntityManager ();

Na druhej strane, the EntityManager inštancie nie sú bezpečné pre vlákna a sú určené na použitie v prostrediach s obmedzeným počtom vlákien. To znamená, že každé vlákno by malo získať svoju inštanciu, pracovať s ňou a na konci ju zavrieť.

Pri použití spravované aplikáciou EntityManagers, je ľahké vytvoriť inštancie obmedzené na vlákna:

EntityManagerFactory emf = // načítané odkiaľkoľvek EntityManager em = emf.createEntityManager (); // použije ho v aktuálnom vlákne

Pri použití spravovania kontajnera však bude všetko kontraproduktívne EntityManagers. Napríklad:

@Service verejná trieda MovieService {@PersistenceContext // alebo dokonca @Autowired súkromný EntityManager entityManager; // vynechané}

Zdá sa, že jeden EntityManager inštancia by mala byť zdieľaná pre všetky operácie. Kontajner (JakartaEE alebo Spring) však namiesto jednoduchého vloží špeciálny proxy server EntityManager tu. Spring napríklad vloží proxy typu SharedEntityManagerCreator.

Zakaždým, keď použijeme injekčne EntityManager, tento proxy server opätovne použije existujúce EntityManager alebo vytvorte nový. Opätovné použitie sa zvyčajne vyskytuje, keď povolíme niečo podobné V zobrazení otvorte program Session / EntityManager.

Tak aj tak, kontajner zaisťuje, že každý EntityManager je obmedzená na jedno vlákno.

5. Prevádzky režimu dlhodobého spánku

The EntityManager API poskytuje súbor metód. Pomocou týchto metód môžeme interagovať s databázou.

5.1. Pretrvávajúce subjekty

Aby sme mohli mať objekt spojený s EntityManager, môžeme využiť pretrvávať () metóda:

public void saveMovie () {EntityManager em = getEntityManager (); em.getTransaction (). begin (); Filmový film = nový film (); film.setId (1L); film.setMovieName ("Krstný otec"); film.setReleaseYear (1972); film.setLanguage ("anglicky"); em. persist (film); em.getTransaction (). commit (); }

Akonáhle je objekt uložený v databáze, je v vytrvalý štát.

5.2. Načítavajú sa entity

Na účely načítania objektu z databázy môžeme použiť Nájsť() metóda.

Tu metóda vyhľadáva podľa primárneho kľúča. Metóda v skutočnosti očakáva typ triedy entity a primárny kľúč:

public Movie getMovie (Long movieId) {EntityManager em = getEntityManager (); Movie movie = em.find (Movie.class, new Long (movieId)); em.detach (film); spiatočný film; }

Ak však potrebujeme iba odkaz na entitu, môžeme použiť getReference () metóda namiesto toho. V skutočnosti vráti proxy entite:

Movie movieRef = em.getReference (Movie.class, new Long (movieId));

5.3. Odpojenie subjektov

V prípade, že je potrebné oddeliť entitu od vytrvalosti, môžeme použiť odpojiť () metóda. Objekt, ktorý sa má odpojiť, odovzdáme metóde:

em.detach (film);

Akonáhle je entita odpojená od kontextu perzistencie, bude v odpojenom stave.

5.4. Zlúčené subjekty

V praxi mnoho aplikácií vyžaduje úpravu entity vo viacerých transakciách. Napríklad môžeme chcieť načítať entitu v jednej transakcii na vykreslenie do používateľského rozhrania. Ďalšia transakcia potom prinesie zmeny vykonané v používateľskom rozhraní.

Môžeme využiť zlúčiť() metódou pre takéto situácie. Metóda zlúčenia pomáha zaviesť zmeny vykonané v odpojenej entite, v spravovanej entite, ak existujú:

public void mergeMovie () {EntityManager em = getEntityManager (); Filmový film = getMovie (1L); em.detach (film); film.setLanguage („taliančina“); em.getTransaction (). begin (); em.merge (film); em.getTransaction (). commit (); }

5.5. Dopytovanie entít

Ďalej môžeme na dopytovanie entít využiť JPQL. Zavoláme getResultList () ich vykonať.

Samozrejme, môžeme použiť getSingleResult (), ak dotaz vráti iba jeden objekt:

verejný zoznam queryForMovies () {EntityManager em = getEntityManager (); Zoznam filmov = em.createQuery ("VYBERTE film z filmu filmu, kde movie.language =? 1") .setParameter (1, "anglicky") .getResultList (); návratové filmy; }

5.6. Odstraňujú sa entity

Navyše, môžeme odstrániť entitu z databázy pomocou odstrániť () metóda. Je dôležité poznamenať, že objekt sa neoddeľuje, ale odstraňuje.

Tu sa stav entity zmení z pretrvávajúceho na nový:

public void removeMovie () {EntityManager em = HibernateOperations.getEntityManager (); em.getTransaction (). begin (); Movie movie = em.find (Movie.class, new Long (1L)); em. odstrániť (film); em.getTransaction (). commit (); }

6. Záver

V tomto článku sme preskúmali EntityManager v Hibernácia. Pozreli sme sa na typy a konfiguráciu a dozvedeli sme sa o rôznych metódach dostupných v API na prácu s kontext vytrvalosti.

Ako vždy, kód použitý v článku je k dispozícii na stránkach Github.


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