INSERT nyilatkozat a JPA-ban

1. Áttekintés

Ebben a gyors bemutatóban megtanuljuk, hogyan kell végezzen INSERT utasítást a JPA objektumokon.

Ha többet szeretne megtudni a hibernálásról általában, olvassa el a tavaszi JPA átfogó útmutatóját, valamint a JPA tavaszi adatok bemutatását a témához való mély merüléshez.

2. Megmaradó objektumok a JPA-ban

A JPA-ban minden entitást, amely átmeneti állapotból menedzselt állapotba kerül, a EntityManager.

A EntityManager ellenőrzi, hogy létezik-e már egy adott entitás, majd eldönti, hogy be kell-e egészíteni vagy frissíteni kell-e. Ezen automatikus kezelés miatt tcsak a JPA által engedélyezett kijelentések a SELECT, UPDATE és TÖRÖL.

Az alábbi példákban megvizsgáljuk a korlátozás kezelésének és megkerülésének különböző módjait.

3. Közös modell meghatározása

Kezdjük egy egyszerű entitás definiálásával, amelyet az oktatóanyagban fogunk használni:

@Entity public class Person {@Id private Long id; privát karakterlánc keresztnév; privát karakterlánc vezetéknév; // szokásos getterek és beállítók, alapértelmezett és all-arg konstruktorok}

Ezenkívül definiáljunk egy lerakatosztályt, amelyet a megvalósításunkhoz használunk:

@Repository public class PersonInsertRepository {@PersistenceContext private EntityManager entitásManager; }

Ezenkívül alkalmazzuk a @ Tranzakció annotáció a tranzakciók automatikus kezelésére tavasszal. Így nem kell aggódnunk a tranzakciók létrehozása miatt EntityManager, változtatások végrehajtása, vagy kivétel esetén a visszagörgetés manuális végrehajtása.

4. createNativeQuery

Kézzel létrehozott lekérdezésekhez használhatjuk a EntityManager # createNativeQuery módszer. Ez lehetővé teszi számunkra, hogy bármilyen típusú SQL lekérdezést hozzunk létre, nem csak a JPA által támogatottakat. Vegyünk fel egy új módszert a tároló osztályunkba:

@Transactionional public void insertWithQuery (Person person) {entityManager.createNativeQuery ("INSERT INTO person (id, first_name, last_name) VALUES (?,?,?)") .SetParameter (1, person.getId ()) .setParameter (2 , person.getFirstName ()) .setParameter (3, person.getLastName ()) .executeUpdate (); }

Ezzel a megközelítéssel meg kell határoznunk egy szó szerinti lekérdezést, amely tartalmazza az oszlopok nevét és beállítja azok megfelelő értékeit.

Most tesztelhetjük a tárunkat:

@Test public void givenPersonEntity_whenInsertedTwiceWithNativeQuery_thenPersistenceExceptionExceptionIsThrown () {Személy = új Személy (1L, "keresztnév", "vezetéknév"); assertThatExceptionOfType (PersistenceException.class) .isThrownBy (() -> {personInsertRepository.insertWithQuery (PERSON); personInsertRepository.insertWithQuery (PERSON);}); }

Tesztünk során minden művelet megpróbál új bejegyzést beilleszteni az adatbázisunkba. Mivel két entitást próbáltunk beilleszteni ugyanazzal id, a második betétművelet meghiúsul a dobással PerzisztenciaKivétel.

Az alapelv itt ugyanaz, ha a Spring Data-t használjuk @Lekérdezés.

5. kitartani

Előző példánkban beszúrási lekérdezéseket hoztunk létre, de minden entitáshoz szó szerinti lekérdezéseket kellett létrehoznunk. Ez a megközelítés nem túl hatékony, és sok kazán kódot eredményez.

Ehelyett használhatjuk a kitartani módszer től EntityManager.

Az előző példához hasonlóan bővítsük ki a lerakat osztályunkat egy egyéni módszerrel:

@Transactionional public void insertWithEntityManager (Személy személy) {this.entityManager.persist (személy); }

Most újra kipróbálhatjuk a megközelítésünket:

@Test public void givenPersonEntity_whenInsertedTwiceWithEntityManager_thenEntityExistsExceptionIsThrown () {assertThatExceptionOfType (EntityExistsException.class) .isThrownBy (() -> {personInsertRepository.insertWithEntityManager (új személy (1L, "firstname", "LastName")); personInsertRepository.insertWithEntityManager (új személy (1L, "keresztnév vezetéknév")); }); }

A natív lekérdezések használatával ellentétben nem kell megadnunk az oszlopneveket és a hozzájuk tartozó értékeket. Helyette, EntityManager kezeli ezt nekünk.

A fenti tesztben arra is számítunk EntityExistsException hogy fel kell dobni a szuperosztálya helyett PerzisztenciaKivétel amely specializáltabb és dobott kitartani.

Másrészt ebben a példában arról kell gondoskodnunk a behelyezési metódusunkat minden alkalommal új Személy.Ellenkező esetben már a EntityManager, frissítési műveletet eredményez.

6. Következtetés

Ebben a cikkben bemutattuk a JPA-objektumok beszúrási műveleteinek végrehajtási módjait. Megvizsgáltuk a natív lekérdezés, valamint a felhasználás példáit Az EntityManager # továbbra is fennáll egyedi INSERT utasítások létrehozásához.

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