@ DynamicUpdate mit Spring Data JPA

1. Übersicht

Wenn wir Spring Data JPA mit Hibernate verwenden, können wir auch die zusätzlichen Funktionen von Hibernate verwenden. @ DynamicUpdate ist eine solche Funktion.

@DynamicUpdate ist eine Annotation auf Klassenebene, die auf eine JPA-Entität angewendet werden kann. Es stellt sicher, dass der Ruhezustand nur die geänderten Spalten in der SQL-Anweisung verwendet, die er für die Aktualisierung einer Entität generiert .

In diesem Artikel werfen wir einen Blick auf die Annotation @DynamicUpdate anhand eines Spring Data JPA- Beispiels.

2. JPA @Entity

Wenn eine Anwendung gestartet wird, generiert Hibernate die SQL-Anweisungen für CRUD-Operationen aller Entitäten. Diese SQL-Anweisungen werden einmal generiert und im Speicher zwischengespeichert, um die Leistung zu verbessern.

Die generierte SQL-Aktualisierungsanweisung enthält alle Spalten einer Entität. Wenn wir eine Entität aktualisieren, werden die Werte der geänderten Spalten an die SQL-Aktualisierungsanweisung übergeben. Für die nicht aktualisierten Spalten verwendet Hibernate die vorhandenen Werte für die Aktualisierung.

Versuchen wir dies anhand eines Beispiels zu verstehen. Betrachten wir zunächst eine JPA-Entität mit dem Namen Account :

@Entity public class Account { @Id private int id; @Column private String name; @Column private String type; @Column private boolean active; // Getters and Setters }

Als Nächstes schreiben wir ein JPA-Repository für die Kontoentität :

@Repository public interface AccountRepository extends JpaRepository { }

Jetzt werden wir die Verwendung AccountRepository die aktualisieren Name Feld eines Kontoobjekt:

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

Nachdem wir dieses Update ausgeführt haben, können wir die generierte SQL-Anweisung überprüfen. Die generierte SQL-Anweisung enthält alle Spalten des Kontos :

update Account set active=?, name=?, type=? where id=?

3. JPA @Entity mit @DynamicUpdate

Wir haben gesehen , dass , obwohl wir das geändert haben Name Feld nur, Hibernate alle Spalten in der SQL - Anweisung enthalten ist.

Nun lassen Sie uns das Add @DynamicUpdate Anmerkung zu dem Konto Einheit:

@Entity @DynamicUpdate public class Account { // Existing data and methods }

Lassen Sie uns als Nächstes denselben Update-Code ausführen, den wir im vorherigen Abschnitt verwendet haben. Wir können sehen, dass das von Hibernate generierte SQL in diesem Fall nur die Namensspalte enthält :

update Account set name=? where id=?

Also, was passiert , wenn wir verwenden @DynamicUpdate auf ein Unternehmen ?

Wenn wir @DynamicUpdate für eine Entität verwenden, verwendet Hibernate die zwischengespeicherte SQL-Anweisung nicht für das Update. Stattdessen wird jedes Mal, wenn wir die Entität aktualisieren, eine SQL-Anweisung generiert. Diese generierte SQL enthält nur die geänderten Spalten .

Um die geänderten Spalten herauszufinden, muss der Ruhezustand den Status der aktuellen Entität verfolgen. Wenn wir also ein Feld einer Entität ändern, werden der aktuelle und der geänderte Status der Entität verglichen.

Dies bedeutet, dass mit @ DynamicUpdate ein Leistungsaufwand verbunden ist . Daher sollten wir es nur verwenden, wenn es tatsächlich benötigt wird.

Natürlich gibt es einige Szenarien, in denen wir diese Anmerkung verwenden sollten - zum Beispiel, wenn eine Entität eine Tabelle mit einer großen Anzahl von Spalten darstellt und nur einige dieser Spalten häufig aktualisiert werden müssen. Wenn wir eine versionlose optimistische Sperrung verwenden, müssen wir auch @DynamicUpdate verwenden .

4. Fazit

In diesem Tutorial haben wir uns mit der Annotation @DynamicUpdate von Hibernate befasst. Wir haben ein Beispiel für Spring Data JPA verwendet, um @DynamicUpdate in Aktion zu sehen. Außerdem haben wir besprochen, wann wir diese Funktion verwenden sollten und wann nicht.

Wie immer sind die vollständigen Codebeispiele, die in diesem Tutorial verwendet werden, auf Github verfügbar.