如何使用' id'在Spring DATA中通过MongDB API使用DocumentDB时?

时间:2017-02-22 05:24:46

标签: java mongodb spring-data azure-cosmosdb

我已使用Spring Docs here中描述的_id映射方式。

  • 使用@Id注释
  • 有一个名称为id且没有任何注释的字段

在我以前的项目中,我们使用MongoDB作为数据库,使用Spring Data进行DAO操作。对于StringBigInteger,它都没有任何问题。

现在我们是using DocumentDB with MongoDB API(因为Spring Data不支持DocumentDB)。 我可以使用所有Spring Data方法,但我无法使用自定义ID。

以下是我的实体:

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");

该记录已成功保留在自定义ID some-id-hereString(不是ObjectId)的数据库中,但之后它会抛出ClassCastException Long无法转换为Integer

BigInteger用于id。

时也是如此

如果我没有设置自定义ID,即我将id的设置评论如下:

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

没有抛出任何异常,但记录被持久化,数据库本身提供的随机ID为ObjectcId

我想用自定义ID保存记录,以便我可以在需要时轻松更新它。 目前,如果我必须更新记录,我需要使用未映射到_id的密钥检索它,然后更新它然后从数据库中删除旧记录然后保留更新的记录,我觉得由于我无法使用_id,因此效率极低。

我的问题是为什么我会收到ClassCastException,也提到将 Long转换为Integer

DocumentDB是否在内部进行了一些抛出此异常的转换。如果是,如何解决?这是一个错误吗?

2 个答案:

答案 0 :(得分:1)

一种替代方法是让DocumentDB/ MongoDB默认为您创建IDs。在您的类中,您可以使用另一个可以作为自然ID的字段,并在该字段上创建唯一索引以进行提取优化。 请参阅https://docs.mongodb.com/manual/reference/method/db.collection.createIndex/索引。

答案 1 :(得分:-1)

这里解释了id生成规则link