我正在尝试向我的域类添加一个动态属性,并且正在尝试一个额外的问题。当数据库为空时,第一个实例会保存正确设置的属性,但后续调用会存储没有该属性的实例。有任何想法吗?
另请注意,我在 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")
}
这是调用它两次的输出
metadatalanguage
java
[language:java]
before-->0
after-->1
metadatalanguage
null
[language:java]
before-->1
after-->1
更新 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
}
我刚刚看到的一件奇怪的事情是版本号。我没有修改任何这些实例,所以版本应该是 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"
}