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

标签 java mongodb jdo datanucleus

我正在使用 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/

相关文章:

google-app-engine - 持久对象列表

java - 查询列表上的 Collections.sort() 抛出 java.lang.UnsupportedOperationException : Query result sets are not modifiable

java - Jtree:将背景颜色设置为最大单双击节点

java - Android 7服务gps更新

mysql - 哪个数据库引擎最适合处理数组值?

mysql - 如何使用 mysql 使用 JDO 将类持久保存到数据库,出现错误

java - 创建通用数组列表

java - 在 for 循环中创建和链接 LinkedList

mongodb - 如何设置 mongod --dbpath

image - 存储数百万张图像