我正在使用Datanucleus / JDO来保存MongoDB DB中的对象。 我尝试持久化一个包含Map的对象,该值类型是一个抽象类。
当我尝试持久化该对象的实例时,抽象类的字段是持久的,而不是子类的字段。
下面是一些代码作为示例。
Zoo.java
@PersistenceCapable
public class Zoo {
@Persistent
private String fieldZoo;
@Persistent
private Map<String, Animal> mapStringAnimal;
// etc... basic constructor...
}
Animal.java
@PersistenceCapable(embeddedOnly = "true")
public abstract class Animal {
@Persistent
private String fieldAnimal;
}
Dog.java
@PersistenceCapable(embeddedOnly = "true")
public class Dog extends Animal {
@Persistent
private String fieldDog;
}
Test.java
public static void main(String[] args) {
Map<String, Animal> mapStringAnimal = new HashMap<String, Animal>();
Dog dog = new Dog("valueFieldAnimal", "valueFieldDog");
mapStringAnimal.put("dogKey", dog);
Zoo zoo = new Zoo("valueFieldZoo", mapStringAnimal);
Properties properties = new Properties();
properties.setProperty("javax.jdo.PersistenceManagerFactoryClass", "org.datanucleus.api.jdo.JDOPersistenceManagerFactory");
properties.setProperty("javax.jdo.option.ConnectionURL", "mongodb:/dbtest");
properties.setProperty("javax.jdo.option.Mapping", "mongodb");
properties.setProperty("datanucleus.autoCreateSchema", "true");
PersistenceManagerFactory pmf = JDOHelper.getPersistenceManagerFactory(properties);
PersistenceManager pm = pmf.getPersistenceManager();
pm.makePersistent(zoo);
pm.close();
}
当我看到MongoDB:
> db.Zoo.find().pretty();
{
"_id" : ObjectId("50d2f5f7e4b0cae285990b2d"),
"fieldZoo" : "valueFieldZoo",
"mapStringAnimal" : [
{
"key" : "dogKey",
"value" : {
"fieldAnimal" : "valueFieldAnimal"
}
}
]
}
答案 0 :(得分:0)
是的,但DataNucleus不支持嵌入的继承地图键/值。它确实支持嵌入式继承的Collection元素(尚未发布的JDO3.1的一部分),但不支持Maps的等效元素。显然代码是开源的,任何人都可以潜入并贡献它(当然你曾经为“动物”添加了一个鉴别器)。