这是实体:
@Document
@Data
public class ApplicationUser {
private String name;
@Indexed(unique = true)
private String email;
private String organization = null;
// other fields
}
我使用他们的电子邮件获取此用户,然后更改他们的名字。我使用ApplicationUserRepository的 autowired 实例。
ApplicationUser applicationUser = applicationUserRepository.findByEmail("abc@gmail.com");
applicationUser.setName("John Doe 2");
然后我尝试在数据库中再次更新此实体:
applicationUserRepository.save(applicationUser);
我在字段电子邮件中收到重复的密钥错误。为什么会这样? 据我所知,如果ObjectId相同, save 方法会更新同一文档。由于我没有更改objectId,为什么在保存期间尝试创建一个新的ApplicationUser?
答案 0 :(得分:0)
我得到了解决方案。 在创建实体时,我必须明确声明Id。
这是实体:
@Document
@Data
public class ApplicationUser {
@Id
private ObjectId _id;
private String name;
@Indexed(unique = true)
private String email;
private String organization = null;
// other fields
}
答案 1 :(得分:0)
我遇到了类似的问题,我正在通过id进行检索,然后尝试更新检索到的POJO,然后通过MongoRepository.save()调用将其保存回去。它在带有Spring Boot 2.1.0的MongoDB 4.x上。我在服务方法中添加了@Transactional批注,所有内容都像一个魅力一样工作。解决了ID字段上的重复键异常。