【问题标题】:Morphia Mapper for entity (for whole Java class / POJO)实体的 Morphia Mapper(用于整个 Java 类/POJO)
【发布时间】:2017-08-24 14:49:46
【问题描述】:

我在使用带有自定义映射器/类型转换器的 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 中有 TypeConverters,你可以注册它们,但它们只对成员有效,对类无效。

换句话说,这不起作用(它只是在运行时被忽略):

@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;
}

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

【问题讨论】:

    标签: morphia


    【解决方案1】:

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

    【讨论】:

    • 好的,谢谢你的回答。我没想到 Morphia 中缺少这样的(至少对我而言)基本功能。我决定删除 Morphia,我回到了基本的 Mongo Java 驱动程序和手动映射。
    猜你喜欢
    • 1970-01-01
    • 2021-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多