0

我正在尝试向我的域类添加一个动态属性,并且正在尝试一个额外的问题。当数据库为空时,第一个实例会保存正确设置的属性,但后续调用会存储没有该属性的实例。有任何想法吗?

另请注意,我在 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"
}
4

1 回答 1

0

我找到了一种解决方法,首先保存没有动态属性的实例,然后使用该动态属性更新实例。

我还提出了一个 JIRA,以防它被认为是一个错误:http: //jira.grails.org/browse/GPMONGODB-306

于 2013-07-04T07:46:17.600 回答