Browse Source

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.
pull/4212/head
Christoph Strobl 3 years ago committed by Mark Paluch
parent
commit
034a3528af
No known key found for this signature in database
GPG Key ID: 4406B84C1661DCD1
  1. 2
      spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/QueryOperations.java
  2. 20
      spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java
  3. 9
      spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/QueryOperationsUnitTests.java
  4. 17
      spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/ReactiveMongoTemplateTests.java

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

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

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

@ -3636,6 +3636,26 @@ public class MongoTemplateTests { @@ -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() {

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

@ -205,6 +205,15 @@ class QueryOperationsUnitTests { @@ -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 {
}

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

@ -218,6 +218,23 @@ public class ReactiveMongoTemplateTests { @@ -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() {

Loading…
Cancel
Save