我正在使用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)
我做错了吗? 谢谢大家!
答案 0 :(得分:2)
好的伙计们, 我弄清楚我的问题是什么,我从没想过会这样。 我在Morphia的Google网上找到了解决方案。
这是一个ClassLoader问题! 我能够将我的实体保存到数据库中,但是第二次,我无法检索任何实体,在任何地方抛出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实例,但我看到有人在做新的Morphia(),我认为它也有效(不是专家;)
瞧!瞧! 希望有一天能帮到某人!