0

ドメイン クラスに 1 つの動的属性を追加しようとしていますが、奇妙な問題を実験しています。データベースが空の場合、最初のインスタンスはプロパティが正しく設定された状態で保存されますが、後続の呼び出しではそのプロパティなしでインスタンスが保存されます。何か案は?

また、必要な場所に新しいプロパティを追加できるように、デフォルトで Config.groovy に nullable:true を設定していることにも注意してください。

これは私のドメインです

class UserBehaviour extends UserActivity{

    Behaviour behaviour
    Site site
    int points

    static belongsTo = [behaviour:Behaviour,site:Site]
}

これはいくつかのprintlnで保存するためのコードです

UserBehaviour userBehaviour = new UserBehaviour(user:user,behaviour:behaviour,site:site,points:behaviour.points,date:new Date())
metadata.each{key,value->
    println "metadata${key}"
    userBehaviour["metadata${key}"] = value
    println userBehaviour["metadata${key}"]
}

println metadata
if (!userBehaviour.save()){
    throw new InvalidRequestException("invalid")
} else {
    println "before-->"+UserBehaviour.countByMetadatalanguage("java")
    //do some things....
    println "after-->"+UserBehaviour.countByMetadatalanguage("java")
}

そして、これはそれを2回呼び出した出力です

metadatalanguage
java
[language:java]
before-->0
after-->1
metadatalanguage
null
[language:java]
before-->1
after-->1

UPDATE 1 _id と日付を除いてほぼ同じであることがわかるように、これらは保存されたドキュメントです (どちらにも metadatalanguage プロパティが必要です...)

{
    _id: 51d50ff5c6c3cf71b9fc2a38
    _class: UserBehaviour
    user: 519f0e14c6c3da4f668c1d3c
    behaviour: 51d410a2c6c3934c7207df6b
    metadatalanguage: java
    points: 50
    date: Thu Jul 04 08:02:29 CEST 2013
    site: 519f0e15c6c3da4f668c1d75
    version: 3
}
{
    _id: 51d50ff7c6c3cf71b9fc2a3a
    _class: UserBehaviour
    user: 519f0e14c6c3da4f668c1d3c
    behaviour: 51d410a2c6c3934c7207df6b
    points: 50,
    date: Thu Jul 04 08:02:31 CEST 2013
    site: 519f0e15c6c3da4f668c1d75
    version: 0
}

私が見た奇妙なことの 1 つは、バージョン番号です。これらのインスタンスを変更していないので、バージョンは 0 である必要があります。

更新 2 userBehaviour2.metadatalanguage をチェックするときにも失敗する小さな統合テストを作成しました。

void testAddDynamicProperty(){
    setup:
        def metadata = ["language":"java"]
        Behaviour behaviour = Behaviour.list([max:1]).first()
        User user = User.list([max:1]).first()
    when:
        UserBehaviour userBehaviour = new UserBehaviour(user:user,behaviour:behaviour,site:site,points:behaviour.points,date:new Date())
        metadata.each{key,value->
            userBehaviour."metadata${key}" = value
        }
        UserBehaviour userBehaviour2 = new UserBehaviour(user:user,behaviour:behaviour,site:site,points:behaviour.points,date:new Date())
        metadata.each{key,value->
            userBehaviour2."metadata${key}" = value
        }
        boolean valid1 = userBehaviour.save()
        boolean valid2 = userBehaviour2.save()
    then:
        valid1 == true
        valid2 == true
        userBehaviour.metadatalanguage == "java"
        userBehaviour2.metadatalanguage == "java"
}
4

1 に答える 1

0

最初に動的属性なしでインスタンスを保存してから、その動的属性でインスタンスを更新するという回避策を見つけました。

バグと見なされる場合に備えて、JIRA も作成しました: http://jira.grails.org/browse/GPMONGODB-306

于 2013-07-04T07:46:17.600 に答える