实体的 Morphia 映射器(对于整个 Java class / POJO)

Morphia Mapper for entity (for whole Java class / POJO)

我在使用带有自定义 Mapper/Type 转换器的 Morphia 时遇到问题

给定以下POJO

@Entity("users")
public class User{

    private String username = null;

    private String password = null;
}

问题是,在给定的 MongoDB(不在我的控制之下)中,值 而不是 只是像

{
    "email": "xy@test.com",
    "password": "abc"
}

但对象看起来更像

{
    "usersettings": {
        "email": "xy@test.com",
        "password": [
                    "abc", "cde", "efg"
                     ]
     }
}

(真实世界 Mongo 文档比您预期的要复杂得多)

所以我必须将 "usersettings.email" 映射到我的 "username" 成员,并将 "usersettings.password.0"(仅限第一个数组)映射到我的 "password" 成员。

我知道 Morphia 中有 TypeConverter,您可以注册它们,但它们仅适用于会员,不适用于 classes。

换句话说,这是行不通的(只是在运行时被忽略):

@Entity("users")
@Converters("MyUserConverter.class")   <-- this does NOT WORK!
public class User{

    private String email = null;

    private String password = null;
}

它适用于这样的会员:

@Entity("users")

public class User{

    private String email = null;

    @Converters("MyCustomTypeConverter.class")   <-- this would work, but does not help in my case!
    private MyCustomType password = null;
}

问题是,我需要映射整个 class 而不仅仅是某些成员。 我该怎么做?

Morphia 不支持类似的东西。文档结构通常必须与对象结构相匹配。但是,您可以使用生命周期注释来处理用于加载和保存实体的 DBObject。在此您可以使用 @PreLoad 重塑进入的 DBObject 以反映您的 Java 对象预期的位置。然后 @PrePersist 将这些值移回 usersettings 下,然后写回 mongo.