Propper将ObjectId字段映射到String

Ces*_*cia 6 java spring mongodb spring-data-mongodb

我正在从我的RDBMS世界和MongoDB的神秘海洋中进行一些探索.我正在使用Spring Data帮助我完成冒险.我需要在两个集合中的文档之间创建一个手动引用(我读过DBRef很贵),我的pojos是这样的:

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;
    ...
}
Run Code Online (Sandbox Code Playgroud)

userID是现有用户的id,并且它作为ObjectId存储在数据库中.当我检索游戏文档时,userID字段被正确映射到String值,但我希望spring-data在持久化时执行逆映射(String to ObjectId),我不知道该怎么做.

请问有人能指出我正确的方向吗?我是否应该放弃这种方法并使用简单的解决方案直接将此字段存储为字符串?

非常感谢!

Ori*_*Dar 5

默认情况下,当使用spring-data-mongodb时,Spring使用a MappingMongoConverter将域对象转换为| 来自文件.

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

以下概述了哪些字段将映射到"_id"文档字段:

用@Id(org.springframework.data.annotation.Id)注释的字段将映射到'_id'字段.没有注释但名为id的字段将映射到"_id"字段.以下概述了在映射到_id文档字段的属性上将进行的类型转换(如果有).

如果在Java类中将名为"id"的字段声明为String或BigInteger,则将尽可能将其转换为ObjectId并将其存储为ObjectId.ObjectId作为字段类型也是有效的.

默认情况下,此转换不会对任何其他标准属性执行.因此,如果您希望userID保存字段,ObjectId只需更改字段类型:private ObjectId userID;

如果你想在MongoDB中保存String 的id属性,那么oposite的情况就不那么简单了User,你必须提供自己的映射转换器来覆盖writeInternal方法(它的名字暗示你不应该这样)或覆盖其他一些Spring MongoDB管道bean进一步向下转换过程