@DynamicUpdate met Spring Data JPA

1. Overzicht

Wanneer we Spring Data JPA met Hibernate gebruiken, kunnen we ook de extra functies van Hibernate gebruiken. @DynamicUpdate is zo'n kenmerk.

@DynamicUpdate is een annotatie op klassenniveau die kan worden toegepast op een PPV-entiteit. Het zorgt ervoor dat Hibernate alleen de gewijzigde kolommen gebruikt in de SQL-instructie die het genereert voor het bijwerken van een entiteit.

In dit artikel zullen we de @DynamicUpdate annotatie, met behulp van een Spring Data JPA voorbeeld.

2. PPV @Entiteit

Wanneer een toepassing start, genereert Hibernate de SQL-instructies voor CRUD-bewerkingen van alle entiteiten. Deze SQL-instructies worden eenmaal gegenereerd en in het geheugen opgeslagen om de prestaties te verbeteren.

De gegenereerde SQL-update-instructie bevat alle kolommen van een entiteit. In het geval dat we een entiteit updaten, worden de waarden van de gewijzigde kolommen doorgegeven aan de SQL update-instructie. Voor de kolommen die niet worden bijgewerkt, gebruikt Hibernate hun bestaande waarden voor de update.

Laten we dit proberen te begrijpen met een voorbeeld. Laten we eerst eens kijken naar een PPV-entiteit met de naam Account:

@Entity public class Account {@Id private int id; @Column private String naam; @Column privé String-type; @Column private boolean actief; // Getters en Setters}

Laten we vervolgens een JPA-repository schrijven voor het Account entiteit:

@Repository openbare interface AccountRepository breidt JpaRepository uit {}

Nu zullen we de AccountRepository om het naam veld van een Account voorwerp:

Account account = accountRepository.findOne (ACCOUNT_ID); account.setName ("Testaccount"); accountRepository.save (account);

Nadat we deze update hebben uitgevoerd, kunnen we de gegenereerde SQL-instructie verifiëren. De gegenereerde SQL-instructie bevat alle kolommen van Account:

update Accountset active = ?, naam = ?, type =? waar id =?

3. PPV @Entiteit met @DynamicUpdate

We hebben gezien dat ook al hebben we het naam veld, heeft Hibernate alle kolommen in de SQL-instructie opgenomen.

Laten we nu het @DynamicUpdate annotatie bij de Account entiteit:

@Entity @DynamicUpdate openbare klasse-account {// Bestaande gegevens en methoden}

Laten we vervolgens dezelfde updatecode uitvoeren die we in de vorige sectie hebben gebruikt. We kunnen zien dat de SQL die door Hibernate wordt gegenereerd, in dit geval alleen de naam kolom:

update Account set name =? waar id =?

Zo, wat gebeurt er als we gebruiken @DynamicUpdate op een entiteit?

Eigenlijk, wanneer we gebruiken @DynamicUpdate op een entiteit gebruikt Hibernate de in de cache opgeslagen SQL-instructie niet voor de update. In plaats daarvan genereert het elke keer dat we de entiteit bijwerken een SQL-instructie. Dit gegenereerde SQL bevat alleen de gewijzigde kolommen.

Om de gewijzigde kolommen te achterhalen, moet Hibernate de status van de huidige entiteit volgen. Dus wanneer we een veld van een entiteit wijzigen, vergelijkt het de huidige en de gewijzigde status van de entiteit.

Dit betekent dat @DynamicUpdate er een prestatieoverhead aan verbonden is. Daarom mogen we het alleen gebruiken als het echt nodig is.

Er zijn zeker een paar scenario's waarin we deze annotatie zouden moeten gebruiken - bijvoorbeeld als een entiteit een tabel vertegenwoordigt met een groot aantal kolommen en slechts een paar van deze kolommen regelmatig moeten worden bijgewerkt. Als we versieloze optimistische vergrendeling gebruiken, moeten we @DynamicUpdate.

4. Conclusie

In deze zelfstudie hebben we gekeken naar de @DynamicUpdate annotatie van Hibernate. We hebben een voorbeeld van Spring Data JPA gebruikt om te zien @DynamicUpdate in actie. We hebben ook besproken wanneer we deze functie moeten gebruiken en wanneer niet.

Zoals altijd zijn de volledige codevoorbeelden die in deze tutorial worden gebruikt, beschikbaar op Github.