我正在使用Spring Data Mongo存储库来持久存储我的实体。所有实体的父类如下:
@Document
public abstract class AbstractEntity {
@Id
private String id;
@CreatedDate
private Date dateCreated;
@LastModifiedDate
private Date lastUpdated;
@Version
private Long version; // This is creating trouble while 'update' operation
}
这就是我配置Mongo存储库和审核的方式:-
@Configuration
@EnableMongoRepositories(basePackages = { "x.y.z" })
@EnableMongoAuditing
@EnableAutoConfiguration
public class MongoRepositoryConfig {
}
我可以将实体保存并“更新”到Mongo,直到我在实体中不包括@Version字段以进行审核为止。
问题
如果我在实体类中使用@Version审核字段,而在尝试使用MongoRepository#save(entity)方法更新实体/文档时,出现以下异常:
Caused by: com.mongodb.MongoException$DuplicateKey: { "serverUsed" : "localhost:27017" , "ok" : 1 , "n" : 0 , "err" : "insertDocument :: caused by :: 11000 E11000 duplicate key error index: test.MENU_ITEM.$_id_ dup key: { : ObjectId('541ed581f39d6f87787067e3') }" , "code" : 11000}
at com.mongodb.CommandResult.getWriteException(CommandResult.java:88)
at com.mongodb.CommandResult.getException(CommandResult.java:79)
at com.mongodb.DBCollectionImpl.translateBulkWriteException(DBCollectionImpl.java:314)
at com.mongodb.DBCollectionImpl.insert(DBCollectionImpl.java:189)
at com.mongodb.DBCollectionImpl.insert(DBCollectionImpl.java:165)
at com.mongodb.DBCollection.insert(DBCollection.java:93)
at com.mongodb.DBCollection.insert(DBCollection.java:78)
at com.mongodb.DBCollection.insert(DBCollection.java:120)
at org.springframework.data.mongodb.core.MongoTemplate$8.doInCollection(MongoTemplate.java:900)
at org.springframework.data.mongodb.core.MongoTemplate.execute(MongoTemplate.java:410)
当实体具有@Version时,为什么upsert操作失败?据我了解,版本字段用于更新操作时的乐观锁定。
save save方法似乎正在尝试执行插入操作,而不是进行更新。 @Version是否有预期行为?
<spring.data.mongo.version>1.6.0.RELEASE</spring.data.mongo.version>
最佳答案
清理Mongo数据库可解决此问题。
在域类中添加@Version Long版本属性之前,集合中没有版本属性的现有mongo文档很少。这是造成问题的原因。
关于mongodb - Spring Data Mongo存储库更新操作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26046165/