Spring Boot Mongo — дубликат ключа E11000

Я создаю простой REST API с помощью spring-boot-starter-data-mongodb и всегда получаю E11000 duplicate key error при попытке вставить вторую строку.

В руководстве по началу работы Spring есть довольно простая конфигурация, которой я следовал, но я должен быть упущенным что-то.

Я удалил коллекцию и начал заново, первый документ сохраняется нормально, но второй также пытается сохранить как id = 0. Как заставить Spring/Mongo правильно увеличиваться?

Вот ошибка, которую я получаю:

org.springframework.dao.DuplicateKeyException: { "serverUsed" : "localhost:27017" , "ok" : 1 , "n" : 0 , "err" : "E11000 duplicate key error index: test.game.$_id_ dup key: { : 0 }" , "code" : 11000}; nested exception is com.mongodb.MongoException$DuplicateKey: { "serverUsed" : "localhost:27017" , "ok" : 1 , "n" : 0 , "err" : "E11000 duplicate key error index: test.game.$_id_ dup key: { : 0 }" , "code" : 11000}

Game

package com.recursivechaos.boredgames.domain;

import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

@Document
public class Game {

    @Id
    private long id;

    private String title;
    private String description;

    public Game() {
    }

    public long getId() {
        return id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

}

Репозиторий игр

package com.recursivechaos.boredgames.repository;

import com.recursivechaos.boredgames.domain.Game;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.data.repository.query.Param;

import java.util.List;

public interface GameRepository extends MongoRepository<Game, Long> {

    List<Game> findByTitle(@Param("title") String title);

}

AppConfig

package com.recursivechaos.boredgames.configuration;

import com.mongodb.Mongo;
import org.springframework.context.annotation.Bean;
import org.springframework.data.authentication.UserCredentials;
import org.springframework.data.mongodb.MongoDbFactory;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.SimpleMongoDbFactory;

public class AppConfig {

    public
    @Bean
    MongoDbFactory mongoDbFactory() throws Exception {
        UserCredentials userCredentials = new UserCredentials("username", "password");
        SimpleMongoDbFactory boredgamesdb = new SimpleMongoDbFactory(new Mongo(), "boredgamesdb", userCredentials);
        return boredgamesdb;
    }

    public
    @Bean
    MongoTemplate mongoTemplate() throws Exception {
        return new MongoTemplate(mongoDbFactory());
    }

}

Спасибо, что посмотрели!

Вы можете просмотреть весь проект здесь.


person Andrew    schedule 15.04.2015    source источник


Ответы (1)


Вы используете примитив long, который имеет неявное заранее заданное значение. Следовательно, это значение передается в MongoDB, и оно сохраняется как есть, поскольку предполагает, что вы хотите определить идентификаторы вручную.

Хитрость заключается в том, чтобы просто использовать тип оболочки, так как это может быть null, MongoDB обнаружит отсутствие значения и автоматически заполнит ObjectID для вас. Однако Long не будет работать, так как ObjectID не помещаются в числовое пространство Long. Для автоматической генерации поддерживаются следующие типы идентификаторов: ObjectId, String и BigInteger.

Все это задокументировано в справочной документации.

person Oliver Drotbohm    schedule 16.04.2015
comment
Вот в чем была хитрость! Я изменил поле своего идентификатора на строку, и проблема была решена. Спасибо! - person Andrew; 16.04.2015
comment
У меня даже не было идентификатора в моем pojo, и у меня была такая же проблема. Как только я установил свой идентификатор как BigInteger, эта проблема была решена. Спасибо, Оливер! - person Krishna; 29.02.2016