我正在使用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/

10-15 22:25