簡體   English   中英

Datanucleus JDO Mongodb - 地圖值中抽象的子項未持久化

[英]Datanucleus JDO Mongodb - Child of abstract in map value not persisted

我正在使用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"
                            }
                    }
            ]
    }

是的,但DataNucleus不支持嵌入式繼承的 Map鍵/值。 它確實支持嵌入式繼承的Collection元素(尚未發布的JDO3.1的一部分),但不支持Maps的等效元素。 顯然代碼是開源的,任何人都可以潛入並貢獻它(當然你曾經為“動物”添加了一個鑒別器)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM