4

私は 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;

    }

犬.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"
                            }
                    }
            ]
    }
4

1 に答える 1

0

はい。ただし、DataNucleus は継承されたMap キー/値の埋め込みをサポートしていません。埋め込みの継承されたコレクション要素 (まだリリースされていない JDO3.1 の一部) はサポートしていますが、マップと同等のものはサポートしていません。明らかに、コードはオープン ソースであり、誰でも飛び込んで貢献することができます (もちろん、"Animal" に識別子を追加すれば)。

于 2012-12-20T15:36:00.650 に答える