Springデータを使用してMongoDBを使用しています。findAndModify
操作を使用して既存のエンティティを更新するか、新しいエンティティを作成します。Spring/MongoDBからの古いエンティティと新しいエンティティの両方を返します。findAndModify
findAndModify
では、returnNew(...)
を使用してエンティティまたは新しいエンティティの古い状態を返すように設定できます。
古いエンティティと新しいエンティティの両方を返す方法はありますか?findAndModify
?
更新前後のエンティティの状態を比較する必要があるため、両方のインスタンスが必要です。手動その後、我々はrequireNew(false)
に頼るしている瞬間
とは、古いインスタンスのコピーを更新し、このような何か:
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);
}
機能しますが、我々は同じことに私たちをやり直すために持っているようにきれいではありません古いインスタンスのコピーのUpdate
に既にあります。
古いインスタンスをロードしてアップデートを実行していたものの、ロードとアップデートの間でエンティティが変更されている可能性があるため安全ではありません。これは、バージョンと楽観的なロックで対処できるかもしれませんが、それは事態をさらに複雑にします。
もう、別の方法はないようですね。 – lexicore