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.