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.