私は 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 を使用することをお勧めします)。
ご提案いただきありがとうございます。