Propper将ObjectId字段映射到String

时间:2014-02-11 17:32:16

标签: 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;
    ...
}

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

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

非常感谢!

1 个答案:

答案 0 :(得分:5)

默认使用spring-data-mongodb时,Spring使用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中将id User属性保存为String,那么oposite案例就不那么简单了,你必须提供自己的映射转换器来覆盖{{1}方法(用它的名字暗示你不应该)或者在转换过程中覆盖其他一些Spring MongoDB管道bean