Skip to content

Commit f53f6b9

Browse files
christophstroblmp911de
authored andcommitted
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.
1 parent fb3bda9 commit f53f6b9

File tree

4 files changed

+47
-1
lines changed

4 files changed

+47
-1
lines changed

spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/QueryOperations.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,7 @@ <T> MappedDocument prepareId(Class<T> type) {
272272
*/
273273
<T> MappedDocument prepareId(@Nullable MongoPersistentEntity<T> entity) {
274274

275-
if (entity == null) {
275+
if (entity == null || source.hasId()) {
276276
return source;
277277
}
278278

spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java

+20
Original file line numberDiff line numberDiff line change
@@ -3659,6 +3659,26 @@ public void saveAndLoadStringThatIsAnObjectIdAsString() {
36593659
assertThat(target).isEqualTo(source);
36603660
}
36613661

3662+
@Test // GH-4184
3663+
void insertHonorsExistingRawId() {
3664+
3665+
RawStringId source = new RawStringId();
3666+
source.id = "abc";
3667+
source.value = "new value";
3668+
3669+
template.insert(source);
3670+
3671+
org.bson.Document result = template
3672+
.execute(db -> db.getCollection(template.getCollectionName(RawStringId.class))
3673+
.find().limit(1).cursor().next());
3674+
3675+
assertThat(result).isNotNull();
3676+
assertThat(result.get("_id")).isEqualTo("abc");
3677+
3678+
RawStringId target = template.findOne(query(where("id").is(source.id)), RawStringId.class);
3679+
assertThat(target).isEqualTo(source);
3680+
}
3681+
36623682
@Test // GH-4026
36633683
void saveShouldGenerateNewIdOfTypeIfExplicitlyDefined() {
36643684

spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/QueryOperationsUnitTests.java

+9
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,15 @@ void insertContextDoesNotAddConvertedIdForMongoIdTypesTargetingObjectId() {
205205
});
206206
}
207207

208+
@Test // GH-4184
209+
void insertContextDoesNotOverrideExistingId() {
210+
211+
assertThat(queryOperations.createInsertContext(new Document("_id", "abc")).prepareId(Person.class).getDocument())//
212+
.satisfies(result -> {
213+
assertThat(result).isEqualTo(new Document("_id", "abc"));
214+
});
215+
}
216+
208217
static class Person {
209218

210219
}

spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/ReactiveMongoTemplateTests.java

+17
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,23 @@ void insertShouldGenerateNewIdOfTypeIfExplicitlyDefined() {
219219
}).verifyComplete();
220220
}
221221

222+
@Test // GH-4184
223+
void insertHonorsExistingRawId() {
224+
225+
MongoTemplateTests.RawStringId source = new MongoTemplateTests.RawStringId();
226+
source.id = "abc";
227+
source.value = "new value";
228+
229+
template.insert(source)
230+
.then(template.execute(db -> Flux.from(
231+
db.getCollection(template.getCollectionName(MongoTemplateTests.RawStringId.class)).find().limit(1).first()))
232+
.next())
233+
.as(StepVerifier::create).consumeNextWith(result -> {
234+
assertThat(result).isNotNull();
235+
assertThat(result.get("_id")).isEqualTo("abc");
236+
});
237+
}
238+
222239
@Test // DATAMONGO-1444
223240
void insertsSimpleEntityCorrectly() {
224241

0 commit comments

Comments
 (0)