Ich präsentiere die Frage mit einem Beispiel.Spring Data JPA - Warum werden Änderungen an einer zurückgegebenen Entität automatisch beibehalten?
behaupten, dass wir ein Repository wie die folgenden haben:
public interface ExampleObjectRepository extends CrudRepository<ExampleObject, Long> {
}
Durch die JpaRepository
Schnittstelle erstreckt, erbt das ExampleObject
Repository die folgende Methode:
T findOne(ID id);
Jetzt habe ich festgestellt, dass, Wenn ich nach einem Aufruf dieser Methode einen Verweis auf ein ExampleObject erhalte, werden alle Manipulationen, die ich an dieser Methode vornimmt, automatisch in der Datenbank gespeichert. Beispiel:
ExampleObject pointInCase = exampleObjectRepository.findOne(1L);
pointInCase.setName("Something else");
Um das Thema zu lesen, verstehe ich das dies bedeutet, dass ExampleObject
Instanz ist not detached
.
Dies widerspricht meinen Erwartungen. Ich habe erwartet, dass ich brauchen würde die Speichermethode von CrudRepository
um geerbt zu verwenden, um die Änderungen zu speichern:
T save(T entity);
würde jemand so freundlich sein, um zu bestätigen, dass Objekte von einem Spring Data JPA Repository zurück bleiben als Standard beigefügt und erläutern, wie die API verwendet wird, um eine Methode im Repository so zu markieren, dass nur abgetrennte Referenzen zurückgegeben werden.
Ich denke, dass die Änderung des Entity-Status auch seine Definition ändern kann, wenn es mit der save(T entity)
Methode verwendet wird, so würde ich auch ein Verständnis dafür, wie Identität für Updates behandelt werden.
Vielen Dank für Ihre Kommentare - sie sind sicherlich im Einklang mit anderen Meinungen im Büro!Werden jedoch im Fall, dass mehrere POJO-Manipulationen als Teil einer Transaktion durchgeführt werden, dieses Verhalten den transaktionalen Charakter der Methode verletzen? – 8bitjunkie
Warum sollte es? Sie starten eine Transaktion, nehmen beliebig viele Änderungen an einer beliebigen Anzahl von Entitäten vor und übernehmen dann die Transaktion. Entweder werden alle Änderungen festgeschrieben oder alle Änderungen werden rückgängig gemacht. Der transaktionale Aspekt einer Methode gilt auch für jede interne Methode, die sie aufruft: Der Transaktionskontext wird propagiert. –
also ... die aufrufende 'save' Methode ist unnötig, außer Sie trennen? Oder ich sollte eine andere Methode aufrufen, um sicherzustellen, dass JPA die Transaktion statt Rollback schließt? – kiedysktos