Spring mongorepository save 抛出重复键异常

Geo*_*rts 8 java spring duplicates mongodb

我正在使用 java 和 Spring。作为测试,我通过 id 查询一个对象,然后尝试保存同一个对象而不更新任何内容。当我这样做时,我得到一个重复的键异常。根据我读过的内容,如果 _id 为空,则 MongoRepository.save() 应该执行插入操作,否则执行更新操作。显然,我应该得到更新。

一点代码:

// Succeeds
Datatype sut = mongoRepository.findOne("569eac0dd4c623dc65508679");  

// Fails with duplicate key.
mongoRepository.save(sut);  
Run Code Online (Sandbox Code Playgroud)

为什么?对其他类的对象重复上述操作,它们就可以工作了。我怎样才能解决这个问题?我不知道如何分解它并隔离问题。

谢谢

错误:

27906 [http-bio-8080-exec-3] 2016-05-02 13:00:26,304 DEBUG org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver -

Resolving exception from handler 
[
  public gov.nist.healthcare.tools.hl7.v2.igamt.lite.web.DatatypeSaveResponse 
gov.nist.healthcare.tools.hl7.v2.igamt.lite.web.controller.DatatypeController.save(
  gov.nist.healthcare.tools.hl7.v2.igamt.lite.domain.Datatype) 
throws gov.nist.healthcare.tools.hl7.v2.igamt.lite.web.exception.DatatypeSaveException
]:
org.springframework.dao.DuplicateKeyException: {
   "serverUsed" : "127.0.0.1:27017" ,
   "ok" : 1 ,
   "n" : 0 , 
   "err" : "E11000 duplicate key error index: igl.datatype.$_id_ dup key: { : ObjectId('569eac0dd4c623dc65508679') }" ,
   "code" : 11000};
nested exception is com.mongodb.MongoException$DuplicateKey: {
  "serverUsed" : "127.0.0.1:27017" ,
  "ok" : 1 ,
  "n" : 0 ,
  "err" : "E11000 duplicate key error index: igl.datatype.$_id_ dup key: { : ObjectId('569eac0dd4c623dc65508679') }" ,
  "code" : 11000}
Run Code Online (Sandbox Code Playgroud)

...重复

我刚刚有了一个发现。当如上所示保存时,spring 会尝试插入,即使 _id 已填充。

当保存其他对象(未显示,但类似)时,spring 执行,更新,并且是 _id 再次填充。

为什么会有差异?文档说 spring 应该在 _id 填充时更新,而在未填充时插入。

还有什么可能导致这种情况吗?我的对象中有什么吗?也许我的阅读转换器?

更新:我刚刚与团队会面。经过仔细检查,我们确定我们不再需要读取转换器。问题通过另一种方式解决。

Rey*_*ard 7

就我而言,问题是我添加了数据模型类的版本。

@Version
private Long version;
Run Code Online (Sandbox Code Playgroud)

旧文档没有,它解析为 null,MongoTemplate 判定这是一个新文档。

在这种情况下,只需使用默认值( private Long version = 0; )初始化版本。


小智 0

在数据库方面,您可能已经创建了唯一索引。请查看“ https://docs.mongodb.com/manual/core/index-unique/ ”了解更多信息。