From b31efb46ec9bc1f11bf02081c59af5144fda5180 Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Fri, 13 Nov 2015 14:13:00 +0100 Subject: [PATCH] DATAMONGO-1204 - ObjectPath now uses raw id values to track resolved objects. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We now use the native id within ObjectPath for checking if a DBref has already been resolved. This is required as MongoDB Java driver 3 generation changed ObjectId.equals(…) which now performs a type check. Original pull request: #334. Related pull request: #288. --- .../core/convert/MappingMongoConverter.java | 3 +- .../data/mongodb/core/MongoTemplateTests.java | 28 ++++++++++++++++++- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverter.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverter.java index 7775767dc..198837438 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverter.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverter.java @@ -264,7 +264,8 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App accessor.setProperty(idProperty, idValue); } - final ObjectPath currentPath = path.push(result, entity, idValue); + final ObjectPath currentPath = path.push(result, entity, idValue != null ? dbo.get(idProperty.getFieldName()) + : null); // Set properties not already set in the constructor entity.doWithProperties(new PropertyHandler() { diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java index 914d4bd4c..920c5a957 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java @@ -3035,7 +3035,7 @@ public class MongoTemplateTests { */ @Test public void takesLimitIntoAccountWhenStreaming() { - + Person youngestPerson = new Person("John", 20); Person oldestPerson = new Person("Jane", 42); @@ -3049,6 +3049,31 @@ public class MongoTemplateTests { assertThat(stream.hasNext(), is(false)); } + /** + * @see DATAMONGO-1204 + */ + @Test + public void resolvesCyclicDBRefCorrectly() { + + SomeMessage message = new SomeMessage(); + SomeContent content = new SomeContent(); + + template.save(message); + template.save(content); + + message.dbrefContent = content; + content.dbrefMessage = message; + + template.save(message); + template.save(content); + + SomeMessage messageLoaded = template.findOne(query(where("id").is(message.id)), SomeMessage.class); + SomeContent contentLoaded = template.findOne(query(where("id").is(content.id)), SomeContent.class); + + assertThat(messageLoaded.dbrefContent.id, is(contentLoaded.id)); + assertThat(contentLoaded.dbrefMessage.id, is(messageLoaded.id)); + } + static class DoucmentWithNamedIdField { @Id String someIdKey; @@ -3351,6 +3376,7 @@ public class MongoTemplateTests { String id; String text; String name; + @org.springframework.data.mongodb.core.mapping.DBRef SomeMessage dbrefMessage; public String getName() { return name;