From 42ab4cb7b4a6728766ff5c4776627d8723218a00 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Mon, 10 Dec 2012 17:38:16 +0900 Subject: [PATCH] DATAMONGO-588 - Version attribute now gets initialized on insert. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The version attribute of an entity has not been correctly initialized to 0 when inserting objects using MongoTemplate.insert(…). We now set it to 0 correctly. --- .../data/mongodb/core/MongoTemplate.java | 14 ++++++++++ .../data/mongodb/core/MongoTemplateTests.java | 28 +++++++++++++++++++ 2 files changed, 42 insertions(+) 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 e68c5c6ae..2dc4a5e9f 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 @@ -657,6 +657,8 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware { assertUpdateableIdIfNotSet(objectToSave); + initializeVersionProperty(objectToSave); + BasicDBObject dbDoc = new BasicDBObject(); maybeEmitEvent(new BeforeConvertEvent(objectToSave)); @@ -669,6 +671,16 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware { maybeEmitEvent(new AfterSaveEvent(objectToSave, dbDoc)); } + private void initializeVersionProperty(Object entity) { + + MongoPersistentEntity mongoPersistentEntity = getPersistentEntity(entity.getClass()); + + if (mongoPersistentEntity == null || mongoPersistentEntity.hasVersionProperty()) { + BeanWrapper, Object> wrapper = BeanWrapper.create(entity, null); + wrapper.setProperty(mongoPersistentEntity.getVersionProperty(), 0); + } + } + public void insert(Collection batchToSave, Class entityClass) { doInsertBatch(determineCollectionName(entityClass), batchToSave, this.mongoConverter); } @@ -713,6 +725,8 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware { List dbObjectList = new ArrayList(); for (T o : batchToSave) { + + initializeVersionProperty(o); BasicDBObject dbDoc = new BasicDBObject(); maybeEmitEvent(new BeforeConvertEvent(o)); 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 3512b67cc..68d4b8de4 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 @@ -1422,6 +1422,34 @@ public class MongoTemplateTests { template.save("Foobar!", "collection"); } + /** + * @see DATAMONGO-588 + */ + @Test + public void initializesVersionOnInsert() { + + PersonWithVersionPropertyOfTypeInteger person = new PersonWithVersionPropertyOfTypeInteger(); + person.firstName = "Dave"; + + template.insert(person); + + assertThat(person.version, is(0)); + } + + /** + * @see DATAMONGO-588 + */ + @Test + public void initializesVersionOnBatchInsert() { + + PersonWithVersionPropertyOfTypeInteger person = new PersonWithVersionPropertyOfTypeInteger(); + person.firstName = "Dave"; + + template.insertAll(Arrays.asList(person)); + + assertThat(person.version, is(0)); + } + static class MyId { String first;