Proljetni podaci JPA @Modifying Annotation

1. Uvod

U ovom kratkom vodiču, naučit ćemo kako stvoriti upite za ažuriranje pomoću Spring Data JPA @Query bilješka. To ćemo postići pomoću @Modificiranje bilješka.

Prvo ćemo osvježiti svoju memoriju i vidjeti kako postavljati upite pomoću Spring Data JPA. Nakon toga ćemo duboko zaroniti u upotrebu @Query i @Modificiranje bilješke. Konačno, vidjet ćemo kako upravljati stanjem našeg konteksta postojanosti prilikom korištenja modificirajućih upita.

2. Upit u proljetnim podacima JPA

Prvo, rezimirajmo 3 mehanizma koja Spring Data JPA pruža za ispitivanje podataka u bazi podataka:

  • Metode upita
  • @Query bilješka
  • Implementacija prilagođenog spremišta

Stvorimo a Korisnik klase i odgovarajuće spremište podataka JPA za ilustraciju ovih mehanizama:

@Entity @Table (name = "users", schema = "users") javna klasa Korisnik {@Id @GeneratedValue (strategija = GenerationType.IDENTITY) private int id; privatni naziv niza; privatni LocalDate datum kreiranja; privatni LocalDate lastLoginDate; private boolean aktivan; privatni String e-mail; }
javno sučelje UserRepository proširuje JpaRepository {}

Mehanizam metoda upita omogućuje nam manipuliranje podacima izvođenjem upita iz naziva metoda:

Popis findAllByName (naziv niza); void deleteAllByCreationDateAfter (datum LocalDate);

U ovom primjeru možemo pronaći upit koji korisnike dohvaća po imenima ili pak upit koji uklanja korisnike koji imaju datum stvaranja nakon određenog datuma.

Što se tiče @Query napomena, pruža nam mogućnost da napišemo određeni JPQL ili SQL upit u @Query bilješka:

@Query ("odaberite u User u gdje je u.email poput '%@gmail.com'") Popis findUsersWithGmailAddress ();

U ovom isječku koda možemo vidjeti upit koji preuzima korisnike koji imaju @ gmail.com email adresa.

Prvi mehanizam omogućuje nam preuzimanje i brisanje podataka. Što se tiče drugog, on nam omogućuje izvršavanje gotovo svih upita. Međutim, za ažuriranje upita moramo dodati @Modificiranje bilješka. Ovo će biti tema ovog vodiča.

3. Korištenje @Modificiranje Bilješka

The @Modificiranje napomena se koristi za poboljšanje @Query napomena za izvršavanje ne samo ODABERI upiti ali i UMETNUTI, AŽURIRANJE, IZBRISATI, pa čak i DDL upiti.

Poigrajmo se malo s ovom bilješkom i pogledajte od čega je napravljena.

Prvo, pogledajmo primjer a @Modificiranje UPDATE upit:

@Modification @Query ("update User u set u.active = false where u.lastLoginDate <: date") void deaktiviratiUsersNotLoggedInSince (@Param ("date") Datum lokalnog datuma);

Ovdje deaktiviramo korisnike koji se nisu prijavili od određenog datuma.

Pokušajmo s još jednim gdje ćemo izbrisati deaktivirane korisnike:

@Modifying @Query ("delete user u where u.active = false") int deleteDeactivatedUsers ();

Kao što vidimo, ova metoda vraća cijeli broj. To je značajka Spring Data JPA @Modificiranje upite koji nam pružaju broj ažuriranih entiteta.

Trebali bismo napomenuti da je izvršavanje upita za brisanje pomoću @Query radi drugačije od Spring Data JPA deleteBy metode upita izvedene iz imena. Potonji prvo dohvaća entitete iz baze podataka, a zatim ih briše jedan po jedan. Dakle, to znači da metoda životnog ciklusa @PreRemove bit će pozvani na te entitete. Međutim, kod prvog se izvršava jedan upit prema bazi podataka.

Na kraju, dodajte a obrisano kolumni do naše KORISNICI stol s a DDL upit:

@Modificiranje @Query (value = "mijenja tablicu USERS.USERS dodati stupac izbrisan int (1) nije null default 0", nativeQuery = true) void addDeletedColumn ();

Nažalost, upotreba izmjena upita ostavlja temeljni kontekst postojanosti zastarjelim. Međutim, moguće je upravljati ovom situacijom. To je tema sljedećeg odjeljka.

4. Upravljanje kontekstom postojanosti

Ako naš modificirajući upit promijeni entitete sadržane u kontekstu postojanosti, tada ovaj kontekst zastarjuje. Jedan od načina za upravljanje ovom situacijom je očistiti kontekst ustrajnosti. Radeći to, osiguravamo da će kontekst postojanosti sljedeći put dohvatiti entitete iz baze podataka.

Međutim, ne moramo izričito zvati čisto() metoda na EntityManager. Možemo jednostavno koristiti jasnoAutomatski nekretnina iz @Modificiranje napomena:

@Modificiranje (clearAutomatically = true)

Na taj način osiguravamo da se kontekst postojanosti očisti nakon izvršenja našeg upita.

Ali, što ako je naš kontekst ustrajnosti sadržavao nesvjesne promjene? Stoga bi njegovo čišćenje značilo ispuštanje nespremljenih promjena. Srećom, postoji još jedno svojstvo napomene koje možemo koristiti - ispratiAutomatski:

@Modifying (flushAutomatically = true)

Sada, EntityManager se ispire prije izvršavanja našeg upita.

5. Zaključak

Time je završen ovaj kratki članak o @Modificiranje bilješka. Vidjeli smo kako koristiti ovu napomenu za izvršavanje ažuriranja upita poput UMETNI, AŽURIRAJ, BRISI, pa čak i DDL. Nakon toga naučili smo kako upravljati stanjem konteksta ustrajnosti s jasnoAutomatski i ispratiAutomatski Svojstva.

Kao i obično, puni kod za ovaj članak dostupan je na GitHubu.


$config[zx-auto] not found$config[zx-overlay] not found