Java ObjectId字段到字符串的Propper映射

Java ObjectId字段到字符串的Propper映射,java,spring,mongodb,spring-data-mongodb,Java,Spring,Mongodb,Spring Data Mongodb,我正在从我的RDBMS世界到MongoDB的神秘海洋进行一点探索。我正在使用Spring数据来帮助我进行冒险。我需要在两个集合中的文档之间创建一个手动引用(我读到DBREF非常昂贵),我的POJO如下所示: public class User { @Id private String id; private String name; private String password; ... } public class Game { @Id

我正在从我的RDBMS世界到MongoDB的神秘海洋进行一点探索。我正在使用Spring数据来帮助我进行冒险。我需要在两个集合中的文档之间创建一个手动引用(我读到DBREF非常昂贵),我的POJO如下所示:

public class User {
    @Id
    private String id;
    private String name;
    private String password;
    ...
}



public class Game {
    @Id
    private String id;
    private String name;
    private String platform;
    private String userID;
    ...
}
userID是现有用户的id,它作为ObjectId存储在数据库中。当我检索一个游戏文档时,userID字段被正确地映射到一个字符串值,但是我希望spring数据在持久化时做反向映射(字符串到ObjectId),我不知道如何做

谁能用这个给我指一下正确的方向吗? 我是否应该放弃这种方法,使用简单的解决方案将此字段直接存储为字符串


非常感谢

默认情况下,当使用spring data mongodb时,spring使用
MappingMongoConverter
将域对象转换为| from文档

id属性的默认转换器策略如下所示:

以下概述了将映射到“\u id”文档字段的字段:

用@Id(org.springframework.data.annotation.Id)注释的字段将映射到“\u Id”字段。 没有注释但命名id的字段将映射到“\u id”字段。 以下概述了将对映射到_id文档字段的属性执行的类型转换(如果有)

如果名为“id”的字段在Java类中声明为String或BigInteger,则该字段将被转换为ObjectId并存储为ObjectId(如果可能)。ObjectId作为字段类型也是有效的

默认情况下,不会将此转换为任何其他标准属性。因此,如果希望
userID
字段另存为
ObjectId
只需更改字段类型:
private ObjectId userID


如果您想将
User
id
属性保存为MongoDB中的字符串,oposite的情况并非不那么简单,您必须提供自己的映射转换器,该转换器覆盖
writeInternal
方法(从名称上看,这意味着您不应该这样做)或者在转换过程中覆盖其他Spring MongoDB管道bean

非常感谢,orid,您的解释对我来说非常清楚,它真的很有帮助。我会听从你的建议。@Ori Dar,我们有域类,它有“id”属性,但没有注释。当我签入mongo db文档时,id和_id有不同的值,但当我通过spring数据检索数据时,id属性的值设置为_id。如何获得mongo中的id的实际值?注意:我们的系统没有在这里将数据插入数据库。@NaveenChappa基本上您可以尝试
@Id String\u Id
@Field(“id”)字符串id但由于这是一个单独的问题,请将其作为一个单独的问题发布,包括您的文档样本和clas@OriDar,我也有同样的场景,当我创建一个新用户(比如名字叫daniel)时,它会将ObjectId为_id的用户保存在db中。但当我尝试更新同一个用户(daniel)时,它会在db中一起创建新的用户对象。因此,名为daniel且具有objectid的旧对象也存在,更新后,名为daniel的新对象在db中以十六进制字符串作为_id创建。我必须知道,在创建和更新过程中有什么不同。我使用的是SpringDataMongoDB和MongoRespositional实现。当您从数据库中列出游戏pojo时,是否可以自动获取与用户ID匹配的用户信息,或者我是否需要执行额外的映射代码?请帮忙。