пружинные данные mongorepository.save E11000 дубликат индекса ошибки ключа иногда - PullRequest
0 голосов
/ 04 июня 2018

Я создал приложение, используя jhipster, где я использую MongoRepository, чтобы вставить или сохранить документ.Но иногда он выдает исключение, но не может понять, в чем причина.Я получаю следующее исключение при работе, то есть Ubuntu:

nested exception is com.mongodb.DuplicateKeyException: Write failed with 
error code 11000 and error message 'E11000 duplicate key error index: 
db_test.collection_test.$_id_ du
p key: { : "1212" }'
    at org.springframework.data.mongodb.core.MongoExceptionTranslator.translateExceptionIfPossible(MongoExceptionTranslator.java:73)
    at org.springframework.data.mongodb.core.MongoTemplate.potentiallyConvertRuntimeException(MongoTemplate.java:2114)
    at org.springframework.data.mongodb.core.MongoTemplate.execute(MongoTemplate.java:464)
    at org.springframework.data.mongodb.core.MongoTemplate.saveDBObject(MongoTemplate.java:1080)
    at org.springframework.data.mongodb.core.MongoTemplate.doSave(MongoTemplate.java:1015)
    at org.springframework.data.mongodb.core.MongoTemplate.save(MongoTemplate.java:961)
    at org.springframework.data.mongodb.repository.support.SimpleMongoRepository.save(SimpleMongoRepository.java:80)

Ниже приведен код Java:

@JsonIgnoreProperties(ignoreUnknown = true)
@Document(collection = "collection_test")
public class CollectionTest implements Serializable {

@Id
private String id;

@Field("c_date")
@Indexed
private String cDate;

public CollctionTest() {
}

public String getId() {
    return id;
}

public void setId(String id) {
    this.id = id;
}

public String getCDate() {
    return cDate;
}

public void setCDate(String cDate) {
    this.cDate = cDate;
}

@Override
public String toString() {
    return "CollctionTest{" +
            "id='" + id + '\'' +
            ", cDate='" + cDate + '\'' +
            '}';
}

}

public interface CollectionTestRepository extends 
 MongoRepository<CollectionTest, String> {
}

@Component
public class CollectionTestService implements ICollectionTestService {

@Autowired
private CollectionTestRepository collectionTestRepository ;

public void saveOrUpdate(CollectionTest collectionTest ) {
    try {
        collectionTestRepository.save(collectionTest);
        LOGGER.info("Inserted document with id: " + collectionTest .getId() 
        + " into database");

    } catch (Exception ex) {
        LOGGER.error("Exception during save or update", ex);
    }
}

}

Примечание: это приложение использует сборпроверить объект через слушателя rabbitmq и вызвать метод saveOrUpdate().

_id имеет пользовательское значение из наших сгенерированных значений.Если _id уже существует в БД, просто обновите документ, иначе вставьте новый документ.Используется MongoRepository.save() для той же цели

1 Ответ

0 голосов
/ 04 июня 2018

это конкретное исключение возникает из БД, когда у вас есть уникальный индекс в вашей БД и вы пытаетесь поместить дублирующее поле данных.

Сначала вы проверяете текущие уникальные индексы:

db.collectionName.getIndexes()

вы пытаетесь обновить документ по конкретному идентификатору и помещаете дубликаты данных для других ваших полей индексации, в этом случае DB выдает исключение для индекса поля _id.хотя это неправильное исключение, оно должно отображаться для определенного поля с повторяющимся именем индекса, но поскольку вы выполняете операцию обновления, это показывает в коде _id

, всегда помните, что если вы используете какой-либо уникальный индекс, то перед вызовомсначала сохраняет, чтобы получить конкретную коллекцию по уникальным индексным ключам, а затем вызывает update.

...