Сохранение Spring Data MongoRepository, вызывающее ошибку Duplicate Key

Вот Сущность:

@Document
@Data
public class ApplicationUser {
    private String name;
    @Indexed(unique = true)
    private String email;
    private String organization = null;
    // other fields
}

Я получаю этого пользователя, используя его электронную почту, а затем меняю его имя. Я использую autowired экземпляр ApplicationUserRepository.

ApplicationUser applicationUser = applicationUserRepository.findByEmail("[email protected]");
applicationUser.setName("John Doe 2");

Затем я снова пытаюсь обновить этот объект в базе данных:

applicationUserRepository.save(applicationUser);

Я получаю повторяющуюся ошибку ключа в поле электронной почты. Почему это происходит? Насколько я понял из документации, метод save обновляет один и тот же документ, если ObjectId тот же. Поскольку я не изменил objectId, то почему он пытается создать нового ApplicationUser во время сохранения?


person conquester    schedule 03.05.2018    source источник


Ответы (2)


Я получил решение. При создании объекта я должен явно объявить идентификатор.

Вот Сущность:

@Document
@Data
public class ApplicationUser {
    @Id
    private ObjectId _id;
    private String name;
    @Indexed(unique = true)
    private String email;
    private String organization = null;
    // other fields
}
person conquester    schedule 03.05.2018

У меня была похожая проблема, когда я извлекал по идентификатору, а затем пытался обновить полученный POJO, а затем сохранить его обратно с помощью вызова MongoRepository.save(). Это было на MongoDB 4.x с Spring Boot 2.1.0. Я добавил аннотацию @Transactional к моему сервисному методу, и все заработало как часы. Исключение дублирования ключа в поле идентификатора было устранено.

person dhrubo    schedule 28.11.2018