diff --git a/pom.xml b/pom.xml
index 41512eaee8..39178d1b94 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
org.springframework.data
spring-data-mongodb-parent
- 1.9.0.BUILD-SNAPSHOT
+ 1.9.0.DATAMONGO-1287-SNAPSHOT
pom
Spring Data MongoDB
diff --git a/spring-data-mongodb-cross-store/pom.xml b/spring-data-mongodb-cross-store/pom.xml
index fd36debedd..dd1c8da214 100644
--- a/spring-data-mongodb-cross-store/pom.xml
+++ b/spring-data-mongodb-cross-store/pom.xml
@@ -6,7 +6,7 @@
org.springframework.data
spring-data-mongodb-parent
- 1.9.0.BUILD-SNAPSHOT
+ 1.9.0.DATAMONGO-1287-SNAPSHOT
../pom.xml
@@ -48,7 +48,7 @@
org.springframework.data
spring-data-mongodb
- 1.9.0.BUILD-SNAPSHOT
+ 1.9.0.DATAMONGO-1287-SNAPSHOT
diff --git a/spring-data-mongodb-distribution/pom.xml b/spring-data-mongodb-distribution/pom.xml
index 28c91bc332..36a307a391 100644
--- a/spring-data-mongodb-distribution/pom.xml
+++ b/spring-data-mongodb-distribution/pom.xml
@@ -13,7 +13,7 @@
org.springframework.data
spring-data-mongodb-parent
- 1.9.0.BUILD-SNAPSHOT
+ 1.9.0.DATAMONGO-1287-SNAPSHOT
../pom.xml
diff --git a/spring-data-mongodb-log4j/pom.xml b/spring-data-mongodb-log4j/pom.xml
index dfe146ff96..b599e28cf0 100644
--- a/spring-data-mongodb-log4j/pom.xml
+++ b/spring-data-mongodb-log4j/pom.xml
@@ -5,7 +5,7 @@
org.springframework.data
spring-data-mongodb-parent
- 1.9.0.BUILD-SNAPSHOT
+ 1.9.0.DATAMONGO-1287-SNAPSHOT
../pom.xml
diff --git a/spring-data-mongodb/pom.xml b/spring-data-mongodb/pom.xml
index 0fcdb2f39f..ca65b7d355 100644
--- a/spring-data-mongodb/pom.xml
+++ b/spring-data-mongodb/pom.xml
@@ -11,7 +11,7 @@
org.springframework.data
spring-data-mongodb-parent
- 1.9.0.BUILD-SNAPSHOT
+ 1.9.0.DATAMONGO-1287-SNAPSHOT
../pom.xml
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 7775767dc5..ae6c49077f 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
@@ -290,7 +290,9 @@ public void doWithAssociation(Association association)
final MongoPersistentProperty property = association.getInverse();
Object value = dbo.get(property.getFieldName());
- if (value == null) {
+ if (value == null
+ || (entity.getPersistenceConstructor().hasParameters() && entity.isConstructorArgument(property) && accessor
+ .getProperty(property) != null)) {
return;
}
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 914d4bd4cf..aad76ace25 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
@@ -197,6 +197,7 @@ protected void cleanDb() {
template.dropCollection(SomeTemplate.class);
template.dropCollection(Address.class);
template.dropCollection(DocumentWithCollectionOfSamples.class);
+ template.dropCollection(DocumentWithLazyDBrefUsedInPresistenceConstructor.class);
}
@Test
@@ -3035,7 +3036,7 @@ public void takesSortIntoAccountWhenStreaming() {
*/
@Test
public void takesLimitIntoAccountWhenStreaming() {
-
+
Person youngestPerson = new Person("John", 20);
Person oldestPerson = new Person("Jane", 42);
@@ -3049,6 +3050,75 @@ public void takesLimitIntoAccountWhenStreaming() {
assertThat(stream.hasNext(), is(false));
}
+ /**
+ * @see DATAMONGO-1287
+ */
+ @Test
+ public void shouldReuseAlreadyResolvedLazyLoadedDBRefWhenUsedAsPersistenceConstrcutorArgument() {
+
+ Document docInCtor = new Document();
+ docInCtor.id = "doc-in-ctor";
+ template.save(docInCtor);
+
+ DocumentWithLazyDBrefUsedInPresistenceConstructor source = new DocumentWithLazyDBrefUsedInPresistenceConstructor(
+ docInCtor);
+
+ template.save(source);
+
+ DocumentWithLazyDBrefUsedInPresistenceConstructor loaded = template.findOne(query(where("id").is(source.id)),
+ DocumentWithLazyDBrefUsedInPresistenceConstructor.class);
+ assertThat(loaded.refToDocUsedInCtor, not(instanceOf(LazyLoadingProxy.class)));
+ assertThat(loaded.refToDocNotUsedInCtor, nullValue());
+ }
+
+ /**
+ * @see DATAMONGO-1287
+ */
+ @Test
+ public void shouldNotReuseLazyLoadedDBRefWhenTypeUsedInPersistenceConstrcutorButValueRefersToAnotherProperty() {
+
+ Document docNotUsedInCtor = new Document();
+ docNotUsedInCtor.id = "doc-but-not-used-in-ctor";
+ template.save(docNotUsedInCtor);
+
+ DocumentWithLazyDBrefUsedInPresistenceConstructor source = new DocumentWithLazyDBrefUsedInPresistenceConstructor(
+ null);
+ source.refToDocNotUsedInCtor = docNotUsedInCtor;
+
+ template.save(source);
+
+ DocumentWithLazyDBrefUsedInPresistenceConstructor loaded = template.findOne(query(where("id").is(source.id)),
+ DocumentWithLazyDBrefUsedInPresistenceConstructor.class);
+ assertThat(loaded.refToDocNotUsedInCtor, instanceOf(LazyLoadingProxy.class));
+ assertThat(loaded.refToDocUsedInCtor, nullValue());
+ }
+
+ /**
+ * @see DATAMONGO-1287
+ */
+ @Test
+ public void shouldRespectParamterValueWhenAttemptingToReuseLazyLoadedDBRefUsedInPersistenceConstrcutor() {
+
+ Document docInCtor = new Document();
+ docInCtor.id = "doc-in-ctor";
+ template.save(docInCtor);
+
+ Document docNotUsedInCtor = new Document();
+ docNotUsedInCtor.id = "doc-but-not-used-in-ctor";
+ template.save(docNotUsedInCtor);
+
+ DocumentWithLazyDBrefUsedInPresistenceConstructor source = new DocumentWithLazyDBrefUsedInPresistenceConstructor(
+ docInCtor);
+ source.refToDocNotUsedInCtor = docNotUsedInCtor;
+
+ template.save(source);
+
+ DocumentWithLazyDBrefUsedInPresistenceConstructor loaded = template.findOne(query(where("id").is(source.id)),
+ DocumentWithLazyDBrefUsedInPresistenceConstructor.class);
+ assertThat(loaded.refToDocUsedInCtor, not(instanceOf(LazyLoadingProxy.class)));
+ assertThat(loaded.refToDocNotUsedInCtor, instanceOf(LazyLoadingProxy.class));
+ }
+
static class DoucmentWithNamedIdField {
@Id String someIdKey;
@@ -3375,4 +3445,18 @@ static class SomeMessage {
@org.springframework.data.mongodb.core.mapping.DBRef SomeContent dbrefContent;
SomeContent normalContent;
}
+
+ static class DocumentWithLazyDBrefUsedInPresistenceConstructor {
+
+ @Id String id;
+ @org.springframework.data.mongodb.core.mapping.DBRef(lazy = true) Document refToDocUsedInCtor;
+ @org.springframework.data.mongodb.core.mapping.DBRef(lazy = true) Document refToDocNotUsedInCtor;
+
+ @PersistenceConstructor
+ public DocumentWithLazyDBrefUsedInPresistenceConstructor(Document refToDocUsedInCtor) {
+ this.refToDocUsedInCtor = refToDocUsedInCtor;
+ }
+
+ }
+
}