2017-02-22 8 views
0

Я использовал оба способа картирования _id, как описано в Spring Docs here.Как использовать 'id' при использовании DocumentDB через MongDB API в Spring DATA?

  • с использованием @Id аннотацию
  • , имеющий поле с именем id без аннотаций

в моем предыдущем проекте, где мы использовали в качестве базы данных MongoDB и Spring данных для операций DAO. Он работал без проблем как для String, так и для BigInteger.

Теперь мы находимся using DocumentDB with MongoDB API (поскольку данные Spring не поддерживают DocumentDB). Я могу использовать все методы Spring Data, но я не могу использовать пользовательский идентификатор.

Ниже моя сущность:

public class S{ 

    private String id; 

    /* other fields here */ 

    public String getId() { 
     return id; 
    } 

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

    /* getters and setters for other fields */ 
} 

Это DAO:

public interface SDao extends MongoRepository<S, String> { 

} 

Теперь, если где-нибудь в моем коде я:

s = new S(); 
s.setId("some-id-here"); 

Запись получает успешно сохраняется в БД с пользовательским идентификатором some-id-here как String (не ObjectId), но после что он выбрасывает ClassCastException: Long не может быть преобразован в Integer.

То же самое происходит при использовании BigInteger для id.

Если я не устанавливать пользовательский идентификатор, то я комментирую установку id, как показано ниже:

s = new S(); 
// s.setId("some-id-here"); 

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

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

Мой вопрос, почему я получаю ClassCastException, что тоже упоминая Конверсия Long в Integer

ли DocumentDB внутренне делать некоторые преобразования, которые бросает это исключение. Если да, то как его решить? Это ошибка?

ответ

1

Один из вариантов мог бы позволить DocumentDB/ MongoDB создать те IDs для вас по умолчанию.В вашем классе у вас может быть другое поле, которое может служить естественным идентификатором и создать уникальный индекс в этом поле для оптимизации выборки. См. https://docs.mongodb.com/manual/reference/method/db.collection.createIndex/ для индексов.

+0

Ну, допустим, что 'id', созданный' mongoDB'/'DocumentDB' по умолчанию, представленный в классе и использующий наш собственный идентификатор для операций. Хотя сейчас есть одно дополнительное поле, но все же оно доступно по цене по сравнению с обходным решением, которое мы должны были выполнить для наших операций по обновлению ранее. благодаря –

-1

правила генерации идентификаторов объясняются здесь link

+0

Да, следуя правилам создания пользовательского идентификатора, я получаю исключение (хотя запись сохраняется). –

+0

Возможно, вы ищете это решение, размещенное на SO http://stackoverflow.com/questions/17530485/spring-data-mongodb-biginteger-to-objectid-conversion – Apollo

+0

Я не помню, чтобы не создавать какие-либо пользовательские преобразователи при использовании MongoDB в качестве прямое хранилище данных. –

Смежные вопросы