@DynamicUpdate s Spring Data JPA

1. Pregled

Kada koristimo Spring Data JPA s Hibernate, možemo koristiti i dodatne značajke Hibernate. @DynamicUpdate jedna je takva značajka.

@DynamicUpdate je napomena na razini klase koja se može primijeniti na JPA entitet. Osigurava da Hibernate koristi samo modificirane stupce u SQL izrazu koji generira za ažuriranje entiteta.

U ovom ćemo članku pogledati @DynamicUpdate napomena, uz pomoć a Proljetni podaci JPA primjer.

2. JPA @ Entitet

Kada se aplikacija pokrene, Hibernate generira SQL izjave za CRUD operacije svih entiteta. Ovi se SQL izrazi generiraju jednom i predmemoriraju se u memoriju radi poboljšanja performansi.

Generirani izraz SQL ažuriranja uključuje sve stupce entiteta. U slučaju da ažuriramo entitet, vrijednosti modificiranih stupaca prosljeđuju se SQL izrazu ažuriranja. Za stupce koji nisu ažurirani, Hibernate koristi njihove postojeće vrijednosti za ažuriranje.

Pokušajmo to razumjeti na primjeru. Prvo, razmotrimo JPA entitet s imenom Račun:

@ Račun javne klase entiteta {@Id private int id; @ Privatni naziv niza stupca; Tip privatnog niza stupca @; @Column private boolean active; // Dobavljači i postavljači}

Dalje, napišimo JPA spremište za Račun entitet:

@Repository javno sučelje AccountRepository proširuje JpaRepository {}

Sada ćemo koristiti AccountRepository za ažuriranje Ime polje an Račun objekt:

Račun računa = accountRepository.findOne (ACCOUNT_ID); account.setName ("Test Account"); accountRepository.save (account);

Nakon što izvršimo ovo ažuriranje, možemo provjeriti generirani SQL izraz. Generirani SQL izraz sadržavat će sve stupce Račun:

ažurirati Set računa aktivan = ?, name = ?, type =? gdje id =?

3. JPA @ Entitet s @DynamicUpdate

To smo vidjeli iako smo modificirali Ime samo polje, Hibernate je uključio sve stupce u SQL izraz.

Dodajmo sada @DynamicUpdate bilješka na Račun entitet:

@Entity @DynamicUpdate račun javne klase {// Postojeći podaci i metode}

Dalje, pokrenimo isti kod za ažuriranje koji smo koristili u prethodnom odjeljku. Možemo vidjeti da SQL koji je generirao Hibernate, u ovom slučaju, uključuje samo Ime stupac:

ažurirati Naziv skupa računa =? gdje id =?

Tako, što se događa kad koristimo @DynamicUpdate na entitetu?

Zapravo, kada koristimo @DynamicUpdate na entitetu Hibernate ne koristi predmemorirani SQL izraz za ažuriranje. Umjesto toga, generirat će SQL izraz svaki put kada ažuriramo entitet. Ovaj generirani SQL uključuje samo promijenjene stupce.

Da bi saznao promijenjene stupce, Hibernate mora pratiti stanje trenutnog entiteta. Dakle, kad promijenimo bilo koje polje entiteta, ono uspoređuje trenutno i modificirano stanje entiteta.

Ovo znači to @DynamicUpdate ima režijske troškove izvedbe povezane s tim. Stoga bismo ga trebali koristiti samo kad je to stvarno potrebno.

Svakako, postoji nekoliko scenarija u kojima bismo trebali koristiti ovu napomenu - na primjer, ako entitet predstavlja tablicu koja ima velik broj stupaca i samo je nekoliko tih stupaca potrebno često ažurirati. Također, kada koristimo optimistično zaključavanje bez verzije, trebamo koristiti @DynamicUpdate.

4. Zaključak

U ovom smo tutorijalu pogledali @DynamicUpdate napomena o hibernaciji. Za prikaz smo koristili primjer Spring Data JPA @DynamicUpdate u akciji. Također, razgovarali smo kada bismo trebali koristiti ovu značajku, a kada ne bismo trebali.

Kao i uvijek, cjeloviti primjeri koda korišteni u ovom vodiču dostupni su na Githubu.