ドメイン クラスに 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"
}