0

私は Grails プロジェクトに取り組んでおり、MongoDB でドキュメントを読み書きするために GORM を使用したいと考えています。実装したい特定のシナリオがあり、これを2〜3日間機能させようとしていますが、何が間違っているのかわかりません。Grails のドキュメント、Web 上の多くの関連記事を読みましたが、まだ何もありません。

簡単にするために、次のような単純なシナリオに取り組んでいます。

私は4つのドメインクラスを持っています:

だれかグルービー

class Someone {

    static mapWith = 'mongo'

    static embedded = ['animal']

    static constraints = {}

    String name

    Animal animal
}

Animal.groovy

class Animal {

    static mapWith = 'mongo'

    static mapping = {
        discriminator column: "type"
    }

    static belongsTo = Someone

    static constraints = {}
}

Dog.groovy

class Dog extends Animal {

    static mapWith = 'mongo'

    String dogName

    static mapping = {
        discriminator value: "dog"
    }

    static belongsTo = Someone

    static constraints = {}
}

Cat.groovy

class Cat extends Animal {

    static mapWith = 'mongo'

    String catName

    static mapping = {
        discriminator value: "cat"
    }

    static belongsTo = Someone

    static constraints = {}
}

ここで、 と呼ばれる Service クラスにCrudService、たとえば というメソッドがfoo()あり、そのメソッドで新しいSomeoneオブジェクトを作成し、それを Mongo データベースに保存します。

Someone someone = new Someone(name: "A name", animal: new Dog(dogName: "Azor"))
someone.save(flush: true)

保存されたものを確認するために mongoDB コレクションを確認すると、次のように表示されます。

{ 
    "_id" : NumberLong(21), 
    "animal" : { 
        "_class" : "Dog", 
        "dogName" : "Azor" 
    }, 
    "name" : "A name", 
    "version" : 0 
}

ご覧のとおり、ドキュメントは保存されましたが、識別子の列名 (および値) は完全に無視されました。ドキュメントは、値"_class"を列名 (デフォルトの識別子列名) として保存し、クラス名 (この場合はDog ) を値として保存しました。

誰かが私を助けて、私がここで間違っていることを教えてもらえますか?

GORM のディスクリミネータ機能が RDBMS では正しく機能するが、NoSQL データベースでは機能しない可能性はありますか?

(現在、私の問題の解決策を提供できるかどうかを確認するために Morphia も検討していますが、Grails のデフォルトの ORM であるため、GORM を使用することをお勧めします)。

ご提案いただきありがとうございます。

4

0 に答える 0