@DynamicUpdate med Spring Data JPA

1. Oversigt

Når vi bruger Spring Data JPA med Dvaletilstand, kan vi også bruge de ekstra funktioner i Dvaletilstand. @DynamicUpdate er en sådan funktion.

@DynamicUpdate er en klassebemærkning, der kan anvendes på en JPA-enhed. Det sikrer, at dvale kun bruger de ændrede kolonner i SQL-sætningen, som det genererer til opdateringen af ​​en enhed.

I denne artikel vil vi se på @DynamicUpdate kommentar ved hjælp af en Spring Data JPA eksempel.

2. JPA @Enhed

Når en applikation starter, genererer dvaletilstand SQL-udsagn til CRUD-operationer for alle enheder. Disse SQL-sætninger genereres én gang og gemmes i hukommelsen for at forbedre ydeevnen.

Den genererede SQL-opdateringserklæring indeholder alle kolonnerne i en enhed. Hvis vi opdaterer en enhed, overføres værdierne for de ændrede kolonner til SQL-opdateringserklæringen. For de kolonner, der ikke er opdateret, bruger Hibernate deres eksisterende værdier til opdateringen.

Lad os prøve at forstå dette med et eksempel. Lad os først overveje en JPA-enhed, der hedder Konto:

@Entity offentlig klassekonto {@Id privat int id; @Kolonne privat strengnavn; @Kolonne privat streng type; @Column privat boolsk aktiv; // Getters og Setters}

Lad os derefter skrive et JPA-lager til Konto enhed:

@Repository offentlig grænseflade AccountRepository udvider JpaRepository {}

Nu bruger vi AccountRepository for at opdatere navn felt af en Konto objekt:

Kontokonto = accountRepository.findOne (ACCOUNT_ID); account.setName ("Testkonto"); accountRepository.save (konto);

Når vi har udført denne opdatering, kan vi kontrollere den genererede SQL-sætning. Den genererede SQL-sætning inkluderer alle kolonnerne i Konto:

opdater Kontosæt aktiv = ?, navn = ?, type =? hvor id =?

3. JPA @Enhed med @DynamicUpdate

Vi har set det, selvom vi har ændret navn kun i feltet, har dvale inkluderet alle kolonnerne i SQL-sætningen.

Lad os nu tilføje @DynamicUpdate kommentar til Konto enhed:

@Entity @DynamicUpdate Offentlig klassekonto {// Eksisterende data og metoder}

Lad os derefter køre den samme opdateringskode, som vi brugte i det foregående afsnit. Vi kan se, at SQL genereret af dvale i dette tilfælde kun inkluderer navn kolonne:

opdater kontosætnavn =? hvor id =?

Så, hvad sker der, når vi bruger @DynamicUpdate på en enhed?

Faktisk når vi bruger @DynamicUpdate på en enhed bruger dvale ikke den cachelagrede SQL-sætning til opdateringen. I stedet genererer det en SQL-sætning hver gang vi opdaterer enheden. Det her genereret SQL inkluderer kun de ændrede kolonner.

For at finde ud af de ændrede kolonner, skal dvale spore tilstanden for den aktuelle enhed. Så når vi ændrer et hvilket som helst felt i en enhed, sammenligner det enhedens nuværende og de modificerede tilstande.

Det betyder at @DynamicUpdate har en performance overhead forbundet med det. Derfor skal vi kun bruge det, når det faktisk er nødvendigt.

Bestemt er der et par scenarier, hvor vi skal bruge denne kommentar - for eksempel hvis en enhed repræsenterer en tabel, der har et stort antal kolonner, og kun et par af disse kolonner skal opdateres ofte. Også når vi bruger version-mindre optimistisk låsning, skal vi bruge @DynamicUpdate.

4. Konklusion

I denne vejledning har vi undersøgt @DynamicUpdate kommentar til dvale. Vi har brugt et eksempel på Spring Data JPA for at se @DynamicUpdate i aktion. Vi har også diskuteret, hvornår vi skal bruge denne funktion, og hvornår vi ikke skal.

Som altid er de komplette kodeeksempler, der bruges i denne vejledning, tilgængelige på Github.