我将 Morphia 与 Play Framework 2.1 项目和 MongoDB 数据库结合使用,但在检索某些数据时遇到问题。
我有一个类 A,它和 @Entity 存储在一个集合中。 但是 A 类有一个 @Embedded List 属性,B 类是抽象的并且有多个实现。
但是这个B类也有一个@Embedded ClassC属性,并且这个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)
我做错了什么吗? 谢谢大家!
最佳答案
好的,伙计们, 我明白了我的问题所在,但我从未想到会是这样。 我在 Google 群组中找到了 Morphia 的解决方案。
这是一个类加载器问题! 我能够将我的实体保存到数据库中,但第二次之后,我无法检索任何实体,到处抛出 ClassNotFoundException...
解决方案是“覆盖”Morphia 的 DefaultCreator,在 Global 类中提供 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(),我认为它也有效(不是专家;) )
瞧! 希望有一天它能帮助别人!
关于playframework-2.0 - Morphia InstantiationException 与抽象 @Embedded 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15907817/