@DynamicUpdate med Spring Data JPA

1. Oversikt

Når vi bruker Spring Data JPA med Hibernate, kan vi også bruke tilleggsfunksjonene i Hibernate. @DynamicUpdate er en slik funksjon.

@DynamicUpdate er en merknad på klassenivå som kan brukes på en JPA-enhet. Det sikrer at dvalemodus bare bruker de modifiserte kolonnene i SQL-setningen som den genererer for oppdateringen av en enhet.

I denne artikkelen tar vi en titt på @DynamicUpdate kommentar, ved hjelp av en Vårdata JPA eksempel.

2. JPA @Enhet

Når et program starter, genererer dvalemodus SQL-setningene for CRUD-operasjoner av alle enhetene. Disse SQL-setningene genereres en gang og lagres i minnet for å forbedre ytelsen.

Den genererte SQL-oppdateringserklæringen inneholder alle kolonnene i en enhet. I tilfelle vi oppdaterer en enhet, overføres verdiene til de modifiserte kolonnene til SQL-oppdateringserklæringen. For kolonnene som ikke er oppdatert, bruker dvalemodus sine eksisterende verdier for oppdateringen.

La oss prøve å forstå dette med et eksempel. La oss først vurdere en JPA-enhet som heter Regnskap:

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

Deretter la oss skrive et JPA-depot for Regnskap enhet:

@Repository offentlig grensesnitt AccountRepository utvider JpaRepository {}

Nå skal vi bruke AccountRepository for å oppdatere Navn felt av en Regnskap gjenstand:

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

Etter at vi har utført denne oppdateringen, kan vi bekrefte den genererte SQL-setningen. Den genererte SQL-setningen inkluderer alle kolonnene i Regnskap:

oppdater Kontosett aktiv = ?, navn = ?, type =? hvor id =?

3. JPA @Enhet med @DynamicUpdate

Vi har sett det selv om vi har endret Navn bare felt, har dvalemodus tatt med alle kolonnene i SQL-setningen.

La oss nå legge til @DynamicUpdate kommentar til Regnskap enhet:

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

La oss deretter kjøre den samme oppdateringskoden som vi brukte i forrige avsnitt. Vi kan se at SQL generert av dvalemodus, i dette tilfellet, bare inkluderer Navn kolonne:

oppdatere kontosettnavn =? hvor id =?

Så, hva skjer når vi bruker @DynamicUpdate på en enhet?

Egentlig når vi bruker @DynamicUpdate på en enhet bruker ikke dvalemodus den bufrede SQL-setningen for oppdateringen. I stedet genererer den en SQL-setning hver gang vi oppdaterer enheten. Dette generert SQL inkluderer bare de endrede kolonnene.

For å finne ut de endrede kolonnene, må dvalemodus spore tilstanden til den nåværende enheten. Så når vi endrer et hvilket som helst felt i en enhet, sammenligner den gjeldende og modifiserte tilstander til enheten.

Dette betyr at @DynamicUpdate har en ytelsesomkostning tilknyttet. Derfor bør vi bare bruke den når det faktisk er nødvendig.

Det er absolutt noen få scenarier der vi bør bruke denne merknaden - for eksempel hvis en enhet representerer en tabell som har et stort antall kolonner, og bare noen få av disse kolonnene må oppdateres ofte. Også når vi bruker versjonsfri optimistisk låsing, må vi bruke @DynamicUpdate.

4. Konklusjon

I denne opplæringen har vi sett på @DynamicUpdate kommentar om dvalemodus. Vi har brukt et eksempel på Spring Data JPA for å se @DynamicUpdate i aksjon. Vi har også diskutert når vi skal bruke denne funksjonen, og når vi ikke skal.

Som alltid er de komplette kodeeksemplene som brukes i denne opplæringen, tilgjengelige på Github.


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