2

マップで参照される埋め込みドキュメントが欲しいのですが(以下の「クラスA」のように)。環境はGrails+GORM+MongoDBです。

それは可能ですか、もしそうなら、どのように?

class A { // fails with IllegalArgumentException occurred when processing request: can't serialize class X in line 234 of org.bson.BasicBSONEncoder
    static mapWith = "mongo"
    Map<String, X> map = new HashMap<String, X>()
}

class B { // works
    static mapWith = "mongo"
    List<X> list = new ArrayList<X>()
}

class C { // works with primitive type values
    static mapWith = "mongo"
    Map<String, String> map = new HashMap<String, String>()
}

class X {
    String data

    public X(String data) {
        this.data = data
    }
}
4

2 に答える 2

3

Art Hanzelがアドバイスしたように、埋め込みは完全に機能します。

ただし、問題は、リストの汎用性を一種の制約として使用しようとしているという事実に起因しています。

Map<String, X>

問題は、 Groovyが汎用性をサポートしていないため、Grailsがこの構文にうまく対応できなかったことです。

ただし、MongoDBプラグインは、カスタムタイプをドメインクラスプロパティとして定義できる非常に強力な機能を提供します。ここを参照してください

あなたの場合、あなたは持つことができます

class A {
    static mapWith = "mongo"
    MyClass map = new MyClass()
}

次に、たとえばsrc / javaで、たとえば

class MyClass extends HashMap<String,X> { }

次に、もちろん、特別なAbstractMappingAwareCustomTypeMarshallerを定義して、DB内のプロパティの読み取りと書き込みの方法を指定する必要があります。

追加の手順として、クラスAにカスタムバリデーターを追加して、データの有効性を確認することもできます。

于 2012-09-02T09:00:52.100 に答える
0

MongoDB Grailsプラグインのドキュメントでは、埋め込みドキュメントの作成方法について説明しています。

class Foo {
    Address address
    List otherAddresses
    static embedded = ['address', 'otherAddresses']
}

頭のてっぺんから、オブジェクトグラフを介してこれらにアクセスできるはずです。あなたがすべきではない理由はわかりません。

myFoo.address.myAddressProperty...
于 2012-08-14T12:26:22.440 に答える