我已使用Spring Docs here中描述的_id
映射方式。
@Id
注释id
且没有任何注释的字段在我以前的项目中,我们使用MongoDB作为数据库,使用Spring Data进行DAO操作。对于String
和BigInteger
,它都没有任何问题。
现在我们是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-here
为String
(不是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是否在内部进行了一些抛出此异常的转换。如果是,如何解决?这是一个错误吗?
答案 0 :(得分:1)
一种替代方法是让DocumentDB/ MongoDB
默认为您创建IDs
。在您的类中,您可以使用另一个可以作为自然ID的字段,并在该字段上创建唯一索引以进行提取优化。
请参阅https://docs.mongodb.com/manual/reference/method/db.collection.createIndex/索引。
答案 1 :(得分:-1)
这里解释了id生成规则link