From 4b018a9d7dd6b7c17e3989df85d7a644b7fbf934 Mon Sep 17 00:00:00 2001 From: Jan Kronquist Date: Wed, 24 Oct 2012 14:58:27 +0200 Subject: [PATCH] DATAMONGO-562 - Saving versioned entity with already set id now works. Instead of inspecting the id property we now assume the version property unset for initialization and work from there. --- .../data/mongodb/core/MongoTemplate.java | 7 ++++--- .../data/mongodb/core/MongoTemplateTests.java | 13 +++++++++++++ 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java index a86866388..e68c5c6ae 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java @@ -760,10 +760,11 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware { this.mongoConverter.getConversionService()); MongoPersistentProperty idProperty = entity.getIdProperty(); MongoPersistentProperty versionProperty = entity.getVersionProperty(); - Object id = beanWrapper.getProperty(idProperty); + + Number version = beanWrapper.getProperty(versionProperty, Number.class, !versionProperty.usePropertyAccess()); // Fresh instance -> initialize version property - if (id == null) { + if (version == null) { beanWrapper.setProperty(versionProperty, 0); doSave(collectionName, objectToSave, this.mongoConverter); } else { @@ -771,7 +772,7 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware { assertUpdateableIdIfNotSet(objectToSave); // Create query for entity with the id and old version - Object version = beanWrapper.getProperty(versionProperty); + Object id = beanWrapper.getProperty(idProperty); Query query = new Query(Criteria.where(idProperty.getName()).is(id).and(versionProperty.getName()).is(version)); // Bump version number 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 bb45d8278..3512b67cc 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 @@ -1310,6 +1310,19 @@ public class MongoTemplateTests { template.save(person); } + /** + * @see DATAMONGO-562 + */ + @Test + public void optimisticLockingHandlingWithExistingId() { + + PersonWithVersionPropertyOfTypeInteger person = new PersonWithVersionPropertyOfTypeInteger(); + person.id = new ObjectId().toString(); + person.age = 29; + person.firstName = "Patryk"; + template.save(person); + } + /** * @see DATAMONGO-539 */