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 39550cd09..8e761fcf6 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 @@ -1016,7 +1016,7 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware { : collection.update(queryObj, updateObj, upsert, multi, writeConcernToUse); if (entity != null && entity.hasVersionProperty() && !multi) { - if (writeResult.getN() == 0) { + if (writeResult.getN() == 0 && dbObjectContainsVersionProperty(queryObj, entity)) { throw new OptimisticLockingFailureException("Optimistic lock exception on saving entity: " + updateObj.toMap().toString() + " to collection " + collectionName); } @@ -1031,14 +1031,21 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware { private void increaseVersionForUpdateIfNecessary(MongoPersistentEntity persistentEntity, Update update) { if (persistentEntity != null && persistentEntity.hasVersionProperty()) { - - String versionPropertyField = persistentEntity.getVersionProperty().getFieldName(); - if (!update.getUpdateObject().containsField(versionPropertyField)) { - update.inc(versionPropertyField, 1L); + if (!dbObjectContainsVersionProperty(update.getUpdateObject(), persistentEntity)) { + update.inc(persistentEntity.getVersionProperty().getFieldName(), 1L); } } } + private boolean dbObjectContainsVersionProperty(DBObject dbObject, MongoPersistentEntity persistentEntity) { + + if (persistentEntity == null || !persistentEntity.hasVersionProperty()) { + return false; + } + + return dbObject.containsField(persistentEntity.getVersionProperty().getFieldName()); + } + public void remove(Object object) { if (object == null) { 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 6bf9dc2fc..aa0fa2cf0 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 @@ -2290,6 +2290,18 @@ public class MongoTemplateTests { assertThat(template.findOne(query, DocumentWithCollectionOfSimpleType.class).values, hasSize(3)); } + /** + * @see DATAMONOGO-828 + */ + @Test + public void updateFirstShouldDoNothingWhenCalledForEntitiesThatDoNotExist() { + + Query q = query(where("id").is(Long.MIN_VALUE)); + + template.updateFirst(q, Update.update("lastname", "supercalifragilisticexpialidocious"), VersionedPerson.class); + assertThat(template.findOne(q, VersionedPerson.class), nullValue()); + } + static class DocumentWithCollection { @Id String id;