Útmutató a hibernált entitáskezelőhöz

1. Bemutatkozás

EntityManager a Java Persistence API része. Elsősorban a JPA 2.0 specifikáció által meghatározott programozási felületeket és életciklus-szabályokat hajtja végre.

Ezenkívül elérhetjük a perzisztencia-kontextust az API-k használatával EntityManager.

Ebben az oktatóanyagban megvizsgáljuk a konfigurációt, típusokat és a különböző API-kat EntityManager.

2. Maven-függőségek

Először bele kell foglalnunk a Hibernate függőségeit:

 org.hibernate hibernate-core 5.4.0.Végső 

Az illesztőprogram-függőségeket is fel kell vennünk, a használt adatbázistól függően:

 mysql mysql-connector-java 8.0.13 

A hibernate-core és a mysql-connector-java függőségek a Maven Centralon érhetők el.

3. Konfiguráció

Most mutassuk be a EntityManager, az a használatával Film entitás, amely megfelel az MOVIE táblának az adatbázisban.

A cikk folyamán felhasználjuk a EntityManager API a Film objektumok az adatbázisban.

3.1. Az entitás meghatározása

Kezdjük azzal, hogy létrehozzuk a MOVIE táblának megfelelő entitást, a @Entity kommentár:

@Entity @Table (name = "MOVIE") public class Movie {@Id private Long id; privát karakterlánc filmNév; magán egész szám kiadása év; privát String nyelv; // szabványos kivitelező, mérőeszközök, beállítók}

3.2. A kitartás.xml File

Amikor az EntityManagerFactory létrehozva, a kitartó megvalósítás a META-INF / persistence.xml fájlt az osztályútvonalon.

Ez a fájl tartalmazza a EntityManager:

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

Magyarázatként meghatározzuk azt a perzisztencia-egységet, amely meghatározza a. Által kezelt mögöttes adattárolót EntityManager.

Továbbá meghatározzuk a dialektust és az alapul szolgáló adattár többi JDBC tulajdonságát. A hibernálás adatbázis-agnosztikus. Ezen tulajdonságok alapján a Hibernate kapcsolatba lép az alapul szolgáló adatbázissal.

4. Konténer és alkalmazás kezelése EntityManager

Alapvetően, kétféle van EntityManager: Konténerkezelés és alkalmazáskezelés.

Nézzük meg közelebbről az egyes típusokat.

4.1. Konténer-kezelt EntityManager

Itt a konténer befecskendezi a EntityManager vállalati komponenseinkben.

Más szavakkal, a konténer létrehozza a EntityManager tól EntityManagerFactory nekünk:

@PersistenceContext EntityManager entitásManager; 

Ez azt is jelenti a konténer felelős a tranzakció megkezdéséért, valamint annak végrehajtásáért vagy visszagörgetéséért.

Hasonlóképpen a konténer feladata a csomag bezárása EntityManager, tehát biztonságos a használatakézi tisztítás nélkül. Még ha megpróbáljuk is bezár a konténerkezelt EntityManager, meg kell dobnia egy IllegalStateException.

4.2. Alkalmazás-kezelt EntityManager

Ezzel szemben a EntityManager itt található alkalmazás kezeli.

Valójában manuálisan fogjuk létrehozni a EntityManager. Ezenkívül kezelni fogjuk a EntityManager hoztunk létre.

Először hozzuk létre a EntityManagerFactory:

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

Annak létrehozása érdekében EntityManager, kifejezetten felhívnunk kell createEntityManager () ban,-ben EntityManagerFactory:

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

Mivel mi vagyunk felelősek az alkotásért EntityManager esetekben az is felelősségünk, hogy bezárjuk őket. Ezért kellene Bezárás minden egyes EntityManager amikor befejeztük a használatukat.

4.3. Menetbiztonság

A EntityManagerFactory példák és következésképpen a Hibernate SessionFactory szálak biztonságosak. Tehát párhuzamos körülmények között teljesen biztonságos írni:

EntityManagerFactory emf = // valahonnan letöltött EntityManager em = emf.createEntityManager ();

Másrészről, a EntityManager a példányok nem biztonságosak a szálak számára, és szálakkal korlátozott környezetekben használhatók. Ez azt jelenti, hogy minden szálnak meg kell szereznie a példányát, együtt kell működnie vele, és a végén le kell zárnia.

Alkalmazás által kezelt használatakor EntityManagers, könnyű szálakkal korlátozott példányokat létrehozni:

EntityManagerFactory emf = // valahonnan beolvasva EntityManager em = emf.createEntityManager (); // használja az aktuális szálban

A konténerkezelés használatakor azonban a dolgok ellentmondásossá válnak EntityManagers. Például:

@Service public class MovieService {@PersistenceContext // vagy akár @Autowired private EntityManager entitásManager; // kihagyva}

Úgy tűnik, hogy az egyik EntityManager példányt meg kell osztani az összes műveletnél. A konténer (JakartaEE vagy Spring) azonban az egyszerű helyett speciális proxyt injektál EntityManager itt. Például Spring egy tipusú proxyt injektál SharedEntityManagerCreator.

Minden alkalommal, amikor az injekciót használjuk EntityManager, ez a proxy vagy újra felhasználja a meglévőt EntityManager vagy újat hozhat létre. Az újrafelhasználás általában akkor fordul elő, amikor ilyesmit engedélyezünk Nyissa meg a Session / EntityManager programot a Nézetben.

Másik út, a tartály biztosítja, hogy mindegyik EntityManager egy szálra korlátozódik.

5. Hibernált entitás műveletek

A EntityManager Az API módszerek gyűjteményét biztosítja. Ezekkel a módszerekkel kölcsönhatásba léphetünk az adatbázissal.

5.1. Megmaradó entitások

Annak érdekében, hogy egy objektum társuljon az EntityManagerhez, használhatjuk a kitartani () módszer:

public void saveMovie () {EntityManager em = getEntityManager (); em.getTransaction (). begin (); Filmfilm = új film (); film.setId (1L); film.setMovieName ("A keresztapa"); film.setReleaseYear (1972); movie.setLanguage ("angol"); em.ellenőr (film); em.getTransaction (). kötelezettség (); }

Miután az objektum mentésre került az adatbázisban, az az kitartó állapot.

5.2. Entitások betöltése

Egy objektum adatbázisból történő lekérése céljából használhatjuk a megtalálja() módszer.

Itt a módszer az elsődleges kulcs alapján keres. Valójában a módszer az entitásosztálytípust és az elsődleges kulcsot várja:

public Movie getMovie (Long movieId) {EntityManager em = getEntityManager (); Filmfilm = em.find (Film.osztály, új Hosszú (movieId)); em.detach (film); visszatérő film; }

Ha azonban csak az entitásra való hivatkozásra van szükségünk, használhatjuk a getReference () módszer helyett. Valójában egy proxyt ad vissza az entitásnak:

Movie movieRef = em.getReference (Film.osztály, új Hosszú (movieId));

5.3. Entitások leválasztása

Abban az esetben, ha le kell választanunk egy entitást a perzisztencia kontextusáról, használhatjuk a leválaszt () módszer. Paraméterként átadjuk a leválasztandó objektumot a metódusnak:

em.detach (film);

Amint az entitás leválik a perzisztencia-kontextusról, leválasztott állapotban lesz.

5.4. Egységek egyesítése

A gyakorlatban sok alkalmazás igényli az entitás módosítását több tranzakció során. Például előfordulhat, hogy egy tranzakcióban szeretnénk lekérni egy entitást, hogy megjelenjen a felhasználói felületen. Ezután egy újabb tranzakció behozza a felhasználói felületen végrehajtott módosításokat.

Használhatjuk a összeolvad() módszer, ilyen helyzetekre. Az egyesítési módszer segít a leválasztott entitásban, a kezelt entitásban végrehajtott módosítások behozatalában, ha vannak ilyenek:

public void mergeMovie () {EntityManager em = getEntityManager (); Filmfilm = getMovie (1L); em.detach (film); film.setLanguage ("olasz"); em.getTransaction (). begin (); em.merge (film); em.getTransaction (). kötelezettség (); }

5.5. Entitások lekérdezése

Ezenkívül felhasználhatjuk a JPQL-t az entitások lekérdezéséhez. Fel fogjuk hívni getResultList () hogy kivégezzék őket.

Természetesen használhatjuk a getSingleResult (), ha a lekérdezés csak egyetlen objektumot ad vissza:

public List queryForMovies () {EntityManager em = getEntityManager (); Sorolja fel a filmeket = em.createQuery ("Válasszon filmet a filmfilmből, ahol a film.nyelv =? 1") .setParameter (1, "angol") .getResultList (); visszatérő filmek; }

5.6. Entitások eltávolítása

Ezenkívül eltávolíthatunk egy entitást az adatbázisból a eltávolítás () módszer. Fontos megjegyezni, hogy az objektumot nem leválasztják, hanem eltávolítják.

Itt az entitás állapota tartósról újra változik:

public void removeMovie () {EntityManager em = HibernateOperations.getEntityManager (); em.getTransaction (). begin (); Filmfilm = em.find (Film.osztály, új Long (1L)); em.eltávolítás (film); em.getTransaction (). kötelezettség (); }

6. Következtetés

Ebben a cikkben feltártuk a EntityManager ban ben Hibernálás. Megnéztük a típusokat és a konfigurációt, és megismerkedtünk az API-val elérhető különféle módszerekkel a kitartás összefüggései.

Mint mindig, a cikkben használt kód elérhető a Github oldalon.