Wir verwenden MongoDB über Spring Data und verwenden die Operation findAndModify
, um vorhandene Entitäten zu aktualisieren oder neue Entitäten zu erstellen.Rückgabe alter und neuer Entitäten aus Spring/MongoDB findAndModify
In der findAndModify
können wir konfigurieren, um den alten Zustand der Entität oder der neuen mit returnNew(...)
zurückgeben.
Gibt es eine Möglichkeit, alte und neue Entitäten von findAndModify
zurückzugeben?
Wir müssen Entitätszustände vor und nach der Aktualisierung vergleichen, deshalb brauchen wir beide Instanzen.
Im Moment sind wir zu requireNew(false)
sind greifen und dann manuell eine Kopie der alten Instanz aktualisieren, so etwas wie dieses:
public Pair<Data> saveItems(String id, List<Item> items) {
final Query findById = ...;
final Update update = new Update();
// This is what we actually update
update.set(ENTITY_FIELD_ITEMS, newItems);
update.inc(ENTITY_FIELD_VERSION, 1);
// Try updating and return the old data
final Data oldData = operations.findAndModify(findById, update,
FindAndModifyOptions.options().upsert(true).returnNew(false), Data.class);
// Copy or create new instance
final Data newData;
if (oldData == null) {
newData = new Data(id);
}
else {
newData = new Data(oldData);
}
// Apply the same update
newData.setItems(newItems);
newData.incVersion();
return new Pair<Data>(oldData, newData);
}
Arbeiten aber ist nicht schön, da wir die gleichen Dinge zu wiederholen haben wir tun Sie bereits in der Update
auf der Kopie der alten Instanz.
Wir haben auch darüber nachgedacht, zuerst eine alte Instanz zu laden und das Update auszuführen, aber es ist nicht sicher, da die Entität möglicherweise zwischen dem Laden und dem Update geändert wurde. Dies kann mit Versionen und optimistischem Sperren behoben werden, aber das macht die Dinge noch komplizierter.
Ja, sieht aus als gäbe es keinen anderen Weg. – lexicore