Vodič za Hibernate EntityManager

1. Uvod

EntityManager dio je Java Persistent API-ja. Poglavito implementira programska sučelja i pravila životnog ciklusa definirana JPA 2.0 specifikacijom.

Štoviše, kontekstu postojanosti možemo pristupiti pomoću API-ja u EntityManager.

U ovom uputstvu ćemo pogledati konfiguraciju, vrste i razne API-je EntityManager.

2. Ovisnosti Mavena

Prvo, moramo uključiti ovisnosti hibernacije:

 org.hibernate hibernate-core 5.4.0.Final 

Također ćemo morati uključiti ovisnosti upravljačkih programa, ovisno o bazi podataka koju koristimo:

 mysql mysql-konektor-java 8.0.13 

Ovisnosti hibernate-core i mysql-connector-java dostupne su na Maven Central.

3. Konfiguracija

Sada, pokažimo EntityManager, pomoću a Film entitet koji odgovara MOVIE tablici u bazi podataka.

Tijekom ovog članka koristit ćemo EntityManager API za rad s Film objekata u bazi podataka.

3.1. Definiranje entiteta

Počnimo s stvaranjem entiteta koji odgovara tablici MOVIE, koristeći @ Entitet napomena:

@Entity @Table (name = "MOVIE") film javne klase {@Id private Long id; private String movieName; privatno Integer izdanjeGodina; privatni jezik gudača; // standardni konstruktor, getteri, postavljači}

3.2. The postojanost.xml Datoteka

Kada EntityManagerFactory je stvoreno, upornost provedbe traži META-INF / persistence.xml datoteku u stazi.

Ova datoteka sadrži konfiguraciju za EntityManager:

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

Da bismo objasnili, definiramo jedinicu postojanosti koja određuje temeljnu podatkovnu bazu kojom upravlja EntityManager.

Nadalje, definiramo dijalekt i druga JDBC svojstva temeljne pohrane podataka. Hibernate je agnostički prema bazama podataka. Na temelju ovih svojstava, Hibernate se povezuje s osnovnom bazom podataka.

4. Upravljanje spremnikom i aplikacijom EntityManager

U osnovi, postoje dvije vrste EntityManager: Upravljanje spremnikom i upravljanje aplikacijama.

Pogledajmo detaljnije svaku vrstu.

4.1. Upravljanje kontejnerom EntityManager

Ovdje spremnik ubrizgava EntityManager u komponentama našeg poduzeća.

Drugim riječima, spremnik stvara EntityManager od EntityManagerFactory za nas:

@PersistenceContext EntityManager entityManager; 

To također znači kontejner je zadužen za početak transakcije, kao i za izvršavanje ili vraćanje.

Slično tome, spremnik je odgovoran za zatvaranje EntityManager, tako da je sigurno za upotrebubez ručnog čišćenja. Čak i ako pokušamo zatvori a upravljano kontejnerom EntityManager, trebao bi baciti IllegalStateException.

4.2. Upravljanje aplikacijama EntityManager

Suprotno tome, životni ciklus EntityManager upravlja ovdje aplikacija.

Zapravo ćemo ručno stvoriti EntityManager. Nadalje, mi ćemo također upravljati životnim ciklusom EntityManager stvorili smo.

Prvo, kreirajmo EntityManagerFactory:

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

Da bi se stvorio EntityManager, moramo izričito nazvati createEntityManager () u EntityManagerFactory:

javni statični EntityManager getEntityManager () {return emf.createEntityManager (); }

Budući da smo mi odgovorni za stvaranje EntityManager slučajevi, također je naša odgovornost da ih zatvorimo. Stoga bismo trebali Zatvoriti svaki EntityManager kad završimo s njihovim korištenjem.

4.3. Sigurnost navoja

The EntityManagerFactory instanci i, shodno tome, hibernacije SjednicaTvornica slučajevi, zaštićeni su nitima. Dakle, potpuno je sigurno u istodobnim kontekstima pisati:

EntityManagerFactory emf = // dohvaćeno odnekud EntityManager em = emf.createEntityManager ();

S druge strane, the EntityManager instance nisu sigurne za nit i namijenjene su korištenju u okruženjima ograničenim nitima. To znači da bi svaka nit trebala dobiti svoju instancu, raditi s njom i zatvoriti je na kraju.

Kada koristite aplikaciju kojom upravlja EntityManagers, lako je stvoriti instance ograničene nitima:

EntityManagerFactory emf = // dohvaćeno odnekud EntityManager em = emf.createEntityManager (); // koristi ga u trenutnoj niti

Međutim, stvari postaju kontraintuitivne kada se koristi spremnikom EntityManagers. Na primjer:

@Service javna klasa MovieService {@PersistenceContext // ili čak @Autowired private EntityManager entityManager; // izostavljeno}

Čini se da jedan EntityManager instancu treba dijeliti za sve operacije. Međutim, spremnik (JakartaEE ili Spring) ubrizgava poseban proxy umjesto jednostavnog EntityManager ovdje. Proljeće, na primjer, ubrizga proxy tipa SharedEntityManagerCreator.

Svaki put kada koristimo ubrizgano EntityManager, ovaj će proxy ili ponovno upotrijebiti postojeći EntityManager ili stvoriti novi. Ponovna upotreba obično se događa kada omogućimo nešto poput Otvorite Session / EntityManager u prikazu.

U svakom slučaju, spremnik osigurava da svaki EntityManager je ograničen na jednu nit.

5. Operacije hibernacije entiteta

The EntityManager API pruža zbirku metoda. Koristeći ove metode možemo komunicirati s bazom podataka.

5.1. Postojani entiteti

Da bismo imali objekt povezan s EntityManager-om, možemo koristiti ustrajati() metoda:

javna praznina saveMovie () {EntityManager em = getEntityManager (); em.getTransaction (). begin (); Filmski film = novi film (); movie.setId (1L); movie.setMovieName ("Kum"); movie.setReleaseYear (1972); movie.setLanguage ("engleski"); em.persist (film); em.getTransaction (). commit (); }

Jednom kada je objekt spremljen u bazu podataka, nalazi se u uporan država.

5.2. Učitavanje entiteta

U svrhu dohvaćanja objekta iz baze podataka možemo koristiti pronaći() metoda.

Ovdje metoda pretražuje prema primarnom ključu. Zapravo, metoda očekuje tip klase entiteta i primarni ključ:

javni film getMovie (Long movieId) {EntityManager em = getEntityManager (); Filmski film = em.find (Movie.class, novi Long (movieId)); em.detach (film); povratak filma; }

Međutim, ako nam samo treba referenca na entitet, možemo koristiti getReference () metoda umjesto toga. Zapravo, vraća proxy entitetu:

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

5.3. Odvajanje entiteta

U slučaju da entitet moramo odvojiti od konteksta postojanosti, možemo koristiti odvojiti() metoda. Predmet koji se odvaja kao parametar prenosimo u metodu:

em.detach (film);

Jednom kada se entitet odvoji od konteksta postojanosti, bit će u izdvojenom stanju.

5.4. Spajanje entiteta

U praksi mnoge aplikacije zahtijevaju izmjenu entiteta u više transakcija. Na primjer, možda ćemo htjeti dohvatiti entitet u jednoj transakciji radi prikazivanja u korisničkom sučelju. Zatim će druga transakcija unijeti promjene izvršene u korisničkom sučelju.

Možemo se poslužiti sjediniti() metoda, za takve situacije. Metoda spajanja pomaže unijeti izmjene u izdvojeni entitet u upravljani entitet, ako postoje:

javna praznina mergeMovie () {EntityManager em = getEntityManager (); Filmski film = getMovie (1L); em.detach (film); movie.setLanguage ("talijanski"); em.getTransaction (). begin (); em.merge (film); em.getTransaction (). commit (); }

5.5. Upit za entitete

Nadalje, možemo koristiti JPQL za postavljanje upita za entitete. Pozvat ćemo se getResultList () da ih pogube.

Naravno, možemo koristiti getSingleResult (), ako upit vraća samo jedan objekt:

javni popis queryForMovies () {EntityManager em = getEntityManager (); Popis filmova = em.createQuery ("ODABERI film iz Filmskog filma gdje je movie.language =? 1") .setParameter (1, "Engleski") .getResultList (); povratak filmova; }

5.6. Uklanjanje entiteta

Dodatno, možemo ukloniti entitet iz baze podataka pomoću ukloniti() metoda. Važno je napomenuti da se objekt ne odvaja, već uklanja.

Ovdje se stanje entiteta mijenja iz trajnog u novo:

javna praznina removeMovie () {EntityManager em = HibernateOperations.getEntityManager (); em.getTransaction (). begin (); Filmski film = em.find (Movie.class, novi Long (1L)); em.remove (film); em.getTransaction (). commit (); }

6. Zaključak

U ovom smo članku istražili EntityManager u Hibernate. Pregledali smo vrste i konfiguraciju i saznali smo o raznim metodama dostupnim u API-ju za rad s kontekst postojanosti.

Kao i uvijek, kôd korišten u članku dostupan je na Githubu.