Browse Source

DATAMONGO-1912 - Propagate autogenerated Id to persistent top-level Maps.

We now set autogenerated Ids in Maps that are used as top-level entities. This allows transparent and persistent Map usage without requiring to use Document in application code. Previously, we only set autogenerated Ids in Document and persistent entity types.

Original Pull Request: #545
pull/538/merge
Mark Paluch 8 years ago committed by Christoph Strobl
parent
commit
18c5ecd36f
  1. 9
      spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java
  2. 9
      spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveMongoTemplate.java
  3. 15
      spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateUnitTests.java
  4. 19
      spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/ReactiveMongoTemplateUnitTests.java

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

@ -2536,15 +2536,18 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware, @@ -2536,15 +2536,18 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware,
* @param savedObject
* @param id
*/
@SuppressWarnings("unchecked")
protected void populateIdIfNecessary(Object savedObject, Object id) {
if (id == null) {
return;
}
if (savedObject instanceof Document) {
Document document = (Document) savedObject;
document.put(ID_FIELD, id);
if (savedObject instanceof Map) {
Map<String, Object> map = (Map<String, Object>) savedObject;
map.put(ID_FIELD, id);
return;
}

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

@ -2224,15 +2224,18 @@ public class ReactiveMongoTemplate implements ReactiveMongoOperations, Applicati @@ -2224,15 +2224,18 @@ public class ReactiveMongoTemplate implements ReactiveMongoOperations, Applicati
* @param savedObject
* @param id
*/
@SuppressWarnings("unchecked")
private void populateIdIfNecessary(Object savedObject, @Nullable Object id) {
if (id == null) {
return;
}
if (savedObject instanceof Document) {
Document Document = (Document) savedObject;
Document.put(ID_FIELD, id);
if (savedObject instanceof Map) {
Map<String, Object> map = (Map<String, Object>) savedObject;
map.put(ID_FIELD, id);
return;
}

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

@ -26,7 +26,9 @@ import lombok.Data; @@ -26,7 +26,9 @@ import lombok.Data;
import java.math.BigInteger;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.regex.Pattern;
@ -218,6 +220,19 @@ public class MongoTemplateUnitTests extends MongoOperationsUnitTests { @@ -218,6 +220,19 @@ public class MongoTemplateUnitTests extends MongoOperationsUnitTests {
assertThat(entity.id, is(notNullValue()));
}
@Test // DATAMONGO-1912
public void autogeneratesIdForMap() {
MongoTemplate template = spy(this.template);
doReturn(new ObjectId()).when(template).saveDocument(Mockito.any(String.class), Mockito.any(Document.class),
Mockito.any(Class.class));
Map<String, String> entity = new LinkedHashMap<>();
template.save(entity, "foo");
assertThat(entity, hasKey("_id"));
}
@Test // DATAMONGO-374
public void convertsUpdateConstraintsUsingConverters() {

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

@ -21,7 +21,11 @@ import static org.mockito.Mockito.*; @@ -21,7 +21,11 @@ import static org.mockito.Mockito.*;
import static org.mockito.Mockito.any;
import static org.springframework.data.mongodb.core.aggregation.Aggregation.*;
import java.util.LinkedHashMap;
import java.util.Map;
import lombok.Data;
import org.bson.types.ObjectId;
import reactor.core.publisher.Mono;
import org.bson.Document;
@ -57,6 +61,7 @@ import com.mongodb.reactivestreams.client.FindPublisher; @@ -57,6 +61,7 @@ import com.mongodb.reactivestreams.client.FindPublisher;
import com.mongodb.reactivestreams.client.MongoClient;
import com.mongodb.reactivestreams.client.MongoCollection;
import com.mongodb.reactivestreams.client.MongoDatabase;
import reactor.test.StepVerifier;
/**
* Unit tests for {@link ReactiveMongoTemplate}.
@ -117,6 +122,20 @@ public class ReactiveMongoTemplateUnitTests { @@ -117,6 +122,20 @@ public class ReactiveMongoTemplateUnitTests {
assertTrue(ReflectionTestUtils.getField(template, "mongoConverter") instanceof MappingMongoConverter);
}
@Test // DATAMONGO-1912
public void autogeneratesIdForMap() {
ReactiveMongoTemplate template = spy(this.template);
doReturn(Mono.just(new ObjectId())).when(template).saveDocument(Mockito.any(String.class), Mockito.any(Document.class),
Mockito.any(Class.class));
Map<String, String> entity = new LinkedHashMap<>();
StepVerifier.create(template.save(entity, "foo")).consumeNextWith(actual -> {
assertThat(entity, hasKey("_id"));
}).verifyComplete();
}
@Test // DATAMONGO-1518
public void findShouldUseCollationWhenPresent() {

Loading…
Cancel
Save