Spring Data JPA @Modifying Annotation
1. Bemutatkozás
Ebben a rövid bemutatóban megtanuljuk, hogyan hozhatunk létre frissítési lekérdezéseket a Spring Data JPA segítségével @Lekérdezés annotáció. Ezt a @ Módosító annotáció.
Először frissítjük a memóriánkat, és megtudjuk, hogyan tehetünk lekérdezéseket a Spring Data JPA segítségével. Ezt követően mélyen belemerülünk a @Lekérdezés és @ Módosító annotációk. Végül megtudjuk, hogyan kezeljük a perzisztencia-kontextus állapotát lekérdezések módosítása során.
2. Lekérdezés a Spring Data JPA-ban
Először is összegezzük a 3 olyan mechanizmus, amelyet a Spring Data JPA biztosít az adatok lekérdezéséhez egy adatbázisban:
- Lekérdezési módszerek
- @Lekérdezés annotáció
- Egyéni tárház megvalósítása
Hozzunk létre egy Felhasználó osztály és egy megfelelő Spring Data JPA-tár a következő mechanizmusok szemléltetésére:
@Entity @Table (name = "users", schema = "users") public class User {@Id @GeneratedValue (strategy = GenerationType.IDENTITY) private int id; privát karakterlánc neve; privát LocalDate creationDate; privát LocalDate lastLoginDate; privát logikai aktív; privát karakterlánc e-mail; }
nyilvános felület A UserRepository kiterjeszti a JpaRepository {}
A lekérdezési módszerek mechanizmusa lehetővé teszi számunkra, hogy az adatokat úgy kezeljük, hogy a lekérdezéseket a metódus nevéből vezetjük le:
List findAllByName (karakterlánc neve); void deleteAllByCreationDateAfter (LocalDate dátum);
Ebben a példában találhatunk egy olyan lekérdezést, amely a felhasználókat a nevük alapján lekéri, vagy pedig egy olyan lekérdezést, amely eltávolítja azokat a felhasználókat, akiknek egy dátum után van létrehozási dátuma.
Ami a @Lekérdezés kommentár, lehetőséget nyújt arra, hogy egy speciális JPQL vagy SQL lekérdezést írjunk a @Lekérdezés annotáció:
@Query ("válasszon u-t a Felhasználó u-ból, ahol az u.email, mint '%@gmail.com'") Sorolja fel a findUsersWithGmailAddress () listát;
Ebben a kódrészletben láthatunk egy lekérdezést, amely lekérdezi azokat a felhasználókat, akiknek van @ gmail.com email cím.
Az első mechanizmus lehetővé teszi számunkra az adatok lekérését vagy törlését. Ami a másodikat illeti, ez lehetővé teszi számunkra, hogy nagyjából bármilyen kérdést végrehajtsunk. Azonban, a lekérdezések frissítéséhez hozzá kell adnunk a @ Módosító annotáció. Ez lesz a bemutató témája.
3. A @ Módosító Megjegyzés
A @ Módosító annotációt használjuk a @Lekérdezés annotáció végrehajtására nemcsak SELECT lekérdezések, hanem INSERT, FRISSÍTÉS, TÖRÖL, sőt még DDL lekérdezések.
Játsszunk egy kicsit ezzel az annotációval, és nézzük meg, miből áll.
Először nézzünk meg egy példát a @ Módosító Lekérdezés frissítése:
@Modifying @Query ("update user u set u.active = false where u.lastLoginDate <: date") void deactivateUsersNotLoggedInSince (@Param ("date") LocalDate date);
Itt deaktiváljuk azokat a felhasználókat, akik egy adott dátum óta nem léptek be.
Próbálkozzunk egy másikkal, ahol töröljük a deaktivált felhasználókat:
@Modifying @Query ("user u törlése ahol u.active = false") int deleteDeactivatedUsers ();
Mint láthatjuk, ez a módszer egész számot ad vissza. A Spring Data JPA egyik jellemzője @ Módosító olyan lekérdezések, amelyek megadják számunkra a frissített entitások számát.
Megjegyezzük, hogy egy törlési lekérdezés végrehajtása a @Lekérdezés a Spring Data JPA-tól eltérően működik deleteBy névből származó lekérdezési módszerek. Ez utóbbi előbb lekéri az entitásokat az adatbázisból, majd egyesével törli őket. Így ez azt jelenti, hogy az életciklus-módszer @PreRove felhívják azokat az entitásokat. Az előbbinél azonban egyetlen lekérdezést hajtanak végre az adatbázis ellen.
Végül tegyünk hozzá egy törölve oszlopot a mi FELHASZNÁLÓK asztal a DDL lekérdezés:
@Modifying @Query (value = "módosítsa a USERS.USERS táblázatot, törölje az oszlopot törölt int (1) nem null alapértelmezett 0", nativeQuery = true) void addDeletedColumn ();
Sajnos a módosító lekérdezések elavulttá teszik a mögöttes perzisztencia-kontextust. Ennek a helyzetnek a kezelése azonban lehetséges. Ez a következő szakasz témája.
4. A perzisztencia kontextusának kezelése
Ha módosító lekérdezésünk megváltoztatja a perzisztencia kontextusban lévő entitásokat, akkor ez a kontextus elavulttá válik. A helyzet kezelésének egyik módja a kitartás kontextusának tisztázása. Ezzel biztosítjuk, hogy a perzisztencia-környezet legközelebb lekérdezze az entitásokat az adatbázisból.
Azonban nem kell kifejezetten a egyértelmű() módszer a EntityManager. Csak használhatjuk a tisztaAutomatikusan ingatlan a @ Módosító kommentár:
@ Módosító (clearAutomatically = true)
Így gondoskodunk arról, hogy a perzisztencia kontextus törlődjön a lekérdezés végrehajtása után.
De mi van akkor, ha a kitartási kontextusunk ki nem változott változásokat tartalmaz? Ezért annak törlése a nem mentett változtatások elvetését jelentené. Szerencsére a jegyzetnek van még egy tulajdonsága, amelyet használhatunk - flushAutomatikusan:
@ Módosító (flushAutomatically = true)
Most a EntityManager a lekérdezés végrehajtása előtt ki van pirulva.
5. Következtetés
Ezzel zárul le ez a rövid cikk a @ Módosító annotáció. Láttuk, hogyan lehet ezt a kommentárt használni az olyan frissítő lekérdezések végrehajtására, mint például INSERT, UPDATE, DELETE, sőt még DDL. Ezt követően megtanultuk, hogyan kell kezelni a perzisztencia kontextus állapotát a tisztaAutomatikusan és flushAutomatikusan tulajdonságait.
Szokás szerint a cikk teljes kódja elérhető a GitHubon.