Spring Data JPA @Modifying Annotation

1. Introduksjon

I denne korte opplæringen, vi lærer hvordan du lager oppdateringsspørsmål med Spring Data JPA @Spørsmål kommentar. Vi oppnår dette ved å bruke @Modifying kommentar.

Først vil vi oppdatere minnet vårt og se hvordan vi kan stille spørsmål ved hjelp av Spring Data JPA. Etter det vil vi dykke inn i bruken av @Spørsmål og @Modifying kommentarer. Til slutt vil vi se hvordan vi kan administrere tilstanden til utholdenhetskonteksten når vi bruker endringsspørsmål.

2. Spørring i vårdata JPA

La oss først oppsummere Tre mekanismer som Spring Data JPA gir for spørring av data i en database:

  • Spørringsmetoder
  • @Spørsmål kommentar
  • Tilpasset implementering av depot

La oss lage en Bruker klasse og et matchende Spring Data JPA-arkiv for å illustrere disse mekanismene:

@Entity @Table (name = "brukere", skjema = "brukere") offentlig klasse bruker {@Id @GeneratedValue (strategi = GenerationType.IDENTITY) privat int id; privat strengnavn; private LocalDate creationDate; privat LocalDate lastLoginDate; privat boolsk aktiv; privat streng e-post; }
offentlig grensesnitt UserRepository utvider JpaRepository {}

Spørringsmetodemekanismen lar oss manipulere dataene ved å utlede spørringene fra metodenavnene:

Liste findAllByName (strengnavn); ugyldig deleteAllByCreationDateAfter (LocalDate dato);

I dette eksemplet kan vi finne et spørsmål som henter brukere etter navn, eller likevel et spørsmål som fjerner brukere som har en opprettelsesdato etter en bestemt dato.

Når det gjelder @Spørsmål kommentar, det gir oss muligheten til å skrive et bestemt JPQL- eller SQL-spørsmål i @Spørsmål kommentar:

@Query ("velg u fra bruker u hvor u.email som '%@gmail.com'" ") Liste findUsersWithGmailAddress ();

I denne kodebiten kan vi se et spørsmål som henter brukere som har en @ gmail.com epostadresse.

Den første mekanismen gjør det mulig for oss å hente eller slette data. Når det gjelder den andre, lar den oss utføre stort sett alle spørsmål. Derimot, for oppdatering av spørsmål, må vi legge til @Modifying kommentar. Dette vil være temaet for denne veiledningen.

3. Bruke @Modifying Kommentar

De @Modifying merknader brukes til å forbedre @Spørsmål kommentar å utføre ikke bare Å VELGE spørsmål, men også SETT INN, OPPDATER, SLETT, Til og med DDL spørsmål.

La oss leke med denne kommentaren litt og se hva den er laget av.

La oss først se et eksempel på en @Modifying UPDATE spørring:

@Modifying @Query ("oppdater bruker du setter u.active = false der u.lastLoginDate <: date") ugyldig deaktivererUsersNotLoggedInSince (@Param ("date") LocalDate dato);

Her deaktiverer vi brukerne som ikke logget på siden en gitt dato.

La oss prøve en annen hvor vi sletter deaktiverte brukere:

@Modifying @Query ("slett bruker du der u.active = false") int deleteDeactivatedUsers ();

Som vi kan se, returnerer denne metoden et helt tall. Det er en funksjon av Spring Data JPA @Modifying spørsmål som gir oss antall oppdaterte enheter.

Vi bør merke oss at å utføre et slettespørring med @Spørsmål fungerer annerledes enn Spring Data JPA deleteBy navneavledede spørringsmetoder. Sistnevnte henter først enhetene fra databasen og sletter dem deretter en etter en. Dermed betyr dette at livssyklusmetoden @PreRemove vil bli kalt på disse enhetene. Imidlertid, med førstnevnte, utføres et enkelt spørsmål mot databasen.

Til slutt, la oss legge til en slettet kolonne til vår BRUKERE bord med en DDL spørsmål:

@Modifying @Query (verdi = "endre tabell USERS.USERS legge til kolonne slettet int (1) ikke null standard 0", nativeQuery = true) ugyldig addDeletedColumn ();

Dessverre gjør bruk av modifiseringsspørsmål den underliggende utholdenhetskonteksten utdatert. Det er imidlertid mulig å håndtere denne situasjonen. Det er gjenstand for neste avsnitt.

4. Administrere Persistence Context

Hvis vårt modifiserende spørsmål endrer enheter som finnes i utholdenhetskonteksten, blir denne konteksten utdatert. En måte å håndtere denne situasjonen på er å fjerne utholdenhetskonteksten. Ved å gjøre det, sørger vi for at utholdenhetskonteksten vil hente enhetene fra databasen neste gang.

Vi trenger imidlertid ikke å eksplisitt ringe klar() metoden på EntityManager. Vi kan bare bruke klarAutomatisk eiendom fra @Modifying kommentar:

@Modifying (clearAutomatically = true)

På den måten sørger vi for at utholdenhetskonteksten blir ryddet etter kjøring av spørringen.

Men hva om vår utholdenhetskontekst inneholdt ikke-spylte endringer? Hvis du tømmer det, vil det bety at du slipper endringer som ikke er lagret. Heldigvis er det en annen egenskap ved merknaden vi kan bruke - skyll automatisk:

@Modifying (flushAutomatically = true)

Nå, den EntityManager blir spylt før spørringen vår blir utført.

5. Konklusjon

Det avslutter denne korte artikkelen om @Modifying kommentar. Vi har sett hvordan vi kan bruke denne kommentaren til å utføre oppdateringsspørsmål som INSERT, UPDATE, SLETT, Til og med DDL. Etter det lærte vi å håndtere tilstanden til utholdenhetskonteksten med klart automatisk og skyll automatisk eiendommer.

Som vanlig er hele koden for denne artikkelen tilgjengelig på GitHub.


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