2

我将 Morphia 与 Play Framework 2.1 项目和 MongoDB 数据库一起使用,但在检索某些数据时遇到了问题。

我有一个 A 类,它和 @Entity 存储在一个集合中。但是那个类 A 有一个 @Embedded List 属性,这个类 B 是抽象的并且有多个实现。

但是这个 Class B 也有一个 @Embedded ClassC 属性,这个 Class C 也是抽象的,也可以有多个实现。

我认为这种结构不能“按原样”使用,而 Morphia 可以处理它。在我的数据库中,对象存储正确,没有错误。

{
    "_id" : ObjectId("5163c9131a887c8e5aea8d5f"),
    "className" : "package.to.ClassA",
    "list" : [
        {
            "propClassB" : [
                {
                    "className" : "package.to.an.ImplementationOfClassB",
                    "propClassC" : {
                        "className" : "package.to.an.ImplementationOfClassC"
                    }
                }
            ]
        }
    ]
}

A类被标记为@Entity,
B类被标记为@Embedded(和@Polymorphic,但我不认为它被使用)
C类被标记为@Embedded(和@Polymorphic)

难道我做错了什么 ?谢谢大家!

4

1 回答 1

2

好的,伙计们,我知道我的问题是什么,而且我从没想过会是这样。我在 Google 小组上找到了 Morphia 的解决方案。

这是一个类加载器问题!我能够将我的实体保存到数据库中,但第二次之后,我无法检索任何实体,到处抛出 ClassNotFoundException ......

解决方案是在 Global 类中“覆盖”Morphia 的 DefaultCreator 以提供 Play 应用程序类加载器(它允许自定义应用程序启动时的行为(onStart() 和 onBeforeStart() 方法)。

Morphia morphia = applicationContext.getBean(Morphia.class);

// Configuring class loader.
morphia.getMapper().getOptions().objectFactory = new DefaultCreator() {
    @Override
    protected ClassLoader getClassLoaderForClass(String clazz, DBObject object) {
        return app.classloader();
    }
};

请注意,我正在使用 Spring Framework 加载 Morphia 实例,但我看到有人在做 new Morphia(),我认为它也可以工作(不是专家;))

瞧!希望有一天它可以帮助某人!

于 2013-04-11T12:36:56.260 回答