2

Play Framework 2.1 プロジェクトと MongoDB データベースで Morphia を使用していますが、一部のデータの取得に問題があります。

コレクションに @Entity が格納されているクラス A があります。しかし、そのクラス A には @Embedded List プロパティがあり、このクラス B は抽象的で、複数の実装があります。

しかし、このクラス B には @Embedded ClassC プロパティもあり、このクラス C も抽象的であり、複数の実装を持つこともできます。

この構造が「そのまま」使用可能で、Morphia がそれを処理できるとは思いません。私のデータベースでは、オブジェクトは正しく保存されており、エラーはありません。

{
    "_id" : ObjectId("5163c9131a887c8e5aea8d5f"),
    "className" : "package.to.ClassA",
    "list" : [
        {
            "propClassB" : [
                {
                    "className" : "package.to.an.ImplementationOfClassB",
                    "propClassC" : {
                        "className" : "package.to.an.ImplementationOfClassC"
                    }
                }
            ]
        }
    ]
}

クラス A は @Entity とマークされ、
クラス B は @Embedded とマークされます (そして @Polymorphic ですが、使用されていないと思います)
クラス C は @Embedded とマークされます (そして @Polymorphic も)

私は何か間違っていますか?全てに感謝 !

4

1 に答える 1

2

わかりました、私は自分の問題が何であるかを理解しました、そして私はこれになるとは思っていませんでした. MorphiaのGoogleグループで解決策を見つけました。

ClassLoader の問題でした。エンティティをデータベースに保存できましたが、2 回目以降はエンティティを取得できず、どこでも ClassNotFoundException がスローされました...

解決策は、Morphia の DefaultCreator を "オーバーライド" して Play アプリケーション クラス ローダーを提供することでした (これにより、(onStart() および onBeforeStart() メソッドで) アプリケーションを開始するときの動作をカスタマイズできます)。

Morphia morphia = applicationContext.getBean(Morphia.class);

// Configuring class loader.
morphia.getMapper().getOptions().objectFactory = new DefaultCreator() {
    @Override
    protected ClassLoader getClassLoaderForClass(String clazz, DBObject object) {
        return app.classloader();
    }
};

私は Spring Framework を使用して Morphia インスタンスをロードしていることに注意してください。しかし、誰かが new Morphia() を実行しているのを見ました。

出来上がり!いつか誰かの役に立てば幸いです!

于 2013-04-11T12:36:56.260 に答える