Preserve given Id on insert.

This commit fixes an issue where an existing Id got replaced with a generated one when using MongoId annotation.

Closes: #4184
Closes: #4197
Original pull request: #4203.
This commit is contained in:
Christoph Strobl
2022-10-11 10:31:06 +02:00
committed by Mark Paluch
parent ff28789507
commit 034a3528af
4 changed files with 47 additions and 1 deletions

View File

@@ -272,7 +272,7 @@ class QueryOperations {
*/
<T> MappedDocument prepareId(@Nullable MongoPersistentEntity<T> entity) {
if (entity == null) {
if (entity == null || source.hasId()) {
return source;
}

View File

@@ -3636,6 +3636,26 @@ public class MongoTemplateTests {
assertThat(target).isEqualTo(source);
}
@Test // GH-4184
void insertHonorsExistingRawId() {
RawStringId source = new RawStringId();
source.id = "abc";
source.value = "new value";
template.insert(source);
org.bson.Document result = template
.execute(db -> db.getCollection(template.getCollectionName(RawStringId.class))
.find().limit(1).cursor().next());
assertThat(result).isNotNull();
assertThat(result.get("_id")).isEqualTo("abc");
RawStringId target = template.findOne(query(where("id").is(source.id)), RawStringId.class);
assertThat(target).isEqualTo(source);
}
@Test // GH-4026
void saveShouldGenerateNewIdOfTypeIfExplicitlyDefined() {

View File

@@ -205,6 +205,15 @@ class QueryOperationsUnitTests {
});
}
@Test // GH-4184
void insertContextDoesNotOverrideExistingId() {
assertThat(queryOperations.createInsertContext(new Document("_id", "abc")).prepareId(Person.class).getDocument())//
.satisfies(result -> {
assertThat(result).isEqualTo(new Document("_id", "abc"));
});
}
static class Person {
}

View File

@@ -218,6 +218,23 @@ public class ReactiveMongoTemplateTests {
}).verifyComplete();
}
@Test // GH-4184
void insertHonorsExistingRawId() {
MongoTemplateTests.RawStringId source = new MongoTemplateTests.RawStringId();
source.id = "abc";
source.value = "new value";
template.insert(source)
.then(template.execute(db -> Flux.from(
db.getCollection(template.getCollectionName(MongoTemplateTests.RawStringId.class)).find().limit(1).first()))
.next())
.as(StepVerifier::create).consumeNextWith(result -> {
assertThat(result).isNotNull();
assertThat(result.get("_id")).isEqualTo("abc");
});
}
@Test // DATAMONGO-1444
void insertsSimpleEntityCorrectly() {