Динамический атрибут сохраняется в первый раз, но не применяется в приложении 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