Динамический атрибут сохраняется в первый раз, но не применяется в приложении grails с mongodb

Я пытаюсь добавить один динамический атрибут в мой класс домена и экспериментирую с проблемой извлечения. Когда база данных пуста, первый экземпляр сохраняется с правильно установленным свойством, но последующие вызовы сохраняют экземпляр без этого свойства. Есть идеи?

Также обратите внимание, что я установил nullable: true по умолчанию в Config.groovy, чтобы позволить добавлять новые свойства именно там, где они мне нужны

Это мой домен

class UserBehaviour extends UserActivity{

    Behaviour behaviour
    Site site
    int points

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

Это код для сохранения с некоторой печатью

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"
}

1 ответ

Решение

Я нашел обходной путь, который заключается в том, чтобы сначала сохранить экземпляр без динамического атрибута, а затем обновить экземпляр с этим динамическим атрибутом.

Я также поднял JIRA на случай, если это будет сочтено ошибкой: http://jira.grails.org/browse/GPMONGODB-306

Другие вопросы по тегам