gpt4 book ai didi

java - Datanucleus JDO Mongodb - 映射值中抽象的子项未保留

转载 作者:可可西里 更新时间:2023-11-01 09:17:26 24 4
gpt4 key购买 nike

我正在使用 Datanucleus/JDO 将对象保存在 MongoDB 数据库中。我尝试持久化一个包含 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;

}

狗.java

    @PersistenceCapable(embeddedOnly = "true")
public class Dog extends Animal {

@Persistent
private String fieldDog;

}

测试.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"
}
}
]
}

最佳答案

是的,但 DataNucleus 不支持嵌入的继承映射键/值。它确实支持嵌入式继承的 Collection 元素(尚未发布的 JDO3.1 的一部分),但不支持 Maps 的等效项。显然,该代码是开源的,任何人都可以深入研究并贡献它(当然,一旦您为“动物”添加了鉴别器)。

关于java - Datanucleus JDO Mongodb - 映射值中抽象的子项未保留,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13971606/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com