Spring-Daten: Die Speichermethode und Aktualisierung von CrudRepository

8

Ich wollte wissen, ob die {save} -Methode in CrudRepository eine Aktualisierung durchführt, wenn sie bereits den Eintrag in der Datenbank wie folgt findet:

%Vor%

Wenn ich also diese Methode für einen bereits registrierten Eintrag aufruft, wird sie aktualisiert, wenn sie ein geändertes Attribut findet?

Danke.

    
Moatez Bouhdid 11.08.2016, 10:31
quelle

4 Antworten

8
  

Ich wollte wissen, ob die Methode {save} in CrudRepository ein Update durchführt   wenn es bereits den Eintrag in der Datenbank findet

Die Frühjahrsdokumentation darüber ist nicht präzise:

  

Speichert eine gegebene Entität. Verwenden Sie die zurückgegebene Instanz für weitere Operationen   Da die Sicherungsoperation möglicherweise die Entitätsinstanz geändert hat   vollständig.

Da die CrudRepository Schnittstelle jedoch keine andere Methode mit einer expliziten Benennung zum Aktualisieren einer Entität vorschlägt, können wir ja annehmen, da CRUD alle CRUD-Operationen ausführen soll (CREATE, READ, UPDATE, DELETE) / p>

Diese Annahme wird durch die Implementierung von SimpleJpaRepository bestätigt Klasse, die die Standardimplementierung von CrudRepository ist, die zeigt, dass beide Fälle von der Methode behandelt werden:

%Vor%
  

Wenn ich diese Methode also auf einem bereits registrierten Eintrag anrufe, wird sie aktualisiert   es, wenn es ein geändertes Attribut findet?

In diesem Fall wird eine Zusammenführungsoperation ausgeführt. Daher werden alle Felder aktualisiert, je nachdem, wie die Optionen "Zusammenführungskaskade" und "Nur lesen" festgelegt werden.

    
davidxxx 11.08.2016, 11:00
quelle
5

Betrachten Sie die Standardimplementierung der CrudRepository-Schnittstelle

%Vor%

Speichermethode zwei Situationen verwalten:

- Wenn die Personen-ID null ist (eine neue Entität wird erstellt), wird das Speichern fortgesetzt. method = & gt; Einfügeabfrage wird ausgeführt.

- Wenn die Personen-ID nicht null ist, wird save die Zusammenführung aufrufen: die vorhandene Entität von entityManagerFactory abrufen (aus dem 2-Ebenen-Cache, wenn sie nicht existiert, wird aus der Datenbank abgerufen) und die abgetrennte Entität mit vergleichen die verwalteten und schließlich propagieren die Änderungen an der Datenbank durch den Aufruf der Update-Abfrage.

    
SEY_91 11.08.2016 11:00
quelle
0

Ich wollte wissen, ob die Methode {save} in CrudRepository eine Aktualisierung durchführt, wenn sie bereits den Eintrag in der Datenbank findet:

Die Antwort ist Ja, sie wird aktualisiert, wenn sie einen Eintrag findet:

Aus der Spring-Dokumentation: Hier Ссылка ?

Das Speichern einer Entität kann über die Methode CrudRepository.save (...) erfolgen. Die angegebene Entität wird beibehalten oder zusammengeführt, indem der zugrunde liegende JPA-EntityManager verwendet wird. Wenn die Entität noch nicht persistent ist, speichert Spring Data JPA die Entität über einen Aufruf an die EntityManager.persist (...) -Methode, andernfalls wird die EntityManager.merge (...) -Methode aufgerufen.

    
Harry 02.11.2017 19:00
quelle
0

Um genau zu sein, behandelt die Methode save (obj) obj als neuen Datensatz, wenn die ID leer ist (daher wird eine Einfügung vorgenommen) und behandelt obj als existierender Datensatz, wenn die ID ausgefüllt ist (also die Zusammenführung durchführt).

Warum ist das wichtig?

Angenommen, das Project-Objekt enthält eine automatisch generierte ID und auch eine person_id, die eindeutig sein muss. Sie erstellen ein Project-Objekt und füllen die person_id, aber nicht die ID aus und versuchen dann zu speichern. Hibernate versucht, diesen Datensatz einzufügen, da die ID leer ist. Wenn diese Person jedoch bereits in der Datenbank vorhanden ist, erhalten Sie eine doppelte Schlüsselausnahme.

Umgang mit
Führen Sie entweder eine findByPersonId (id) aus, um zu überprüfen, ob sich das obj bereits in der db befindet, und holen Sie sich die id, falls es gefunden wurde,
Oder versuchen Sie einfach das Speichern und fangen Sie die Ausnahme ab. In diesem Fall wissen Sie, dass es sich bereits in der Datenbank befindet. Sie müssen die ID vor dem Speichern abrufen und festlegen.

    
LConrad 06.03.2018 17:33
quelle