使用Grails / Terracotta时遇到hasMany(1-M)关系时出现以下问题。我有以下域模型(伪代码):
User {
String username
List languages
static hasMany = [ languages: Language ]
static mapping = {
cache true
languages cache: true, cascade: "all-delete-orphan", lazy: true
}
}
Language {
String name
static belongsTo = [user: User]
}
使用在BootStrap.groovy中注册的编组器将其作为JSON返回:
JSON.registerObjectMarshaller(User) {
def returnArray = [:]
returnArray['id'] = it.id
returnArray['username']
returnArray['languages'] = it.languages
}
JSON.registerObjectMarshaller(Language) {
def returnArray = [:]
returnArray['id'] = it.id
returnArray['name'] = it.name
}
我们遇到的问题是,使用缓存(Terracotta),我们看到数据库中有多种语言的用户只有一种语言在前端。返回的JSON如下所示:
{
id: 1
username: "Test",
languages: [
null,
{"id": 1089,name: "French"}
]
}
在此示例中,用户在数据库中有三种语言(所有语言都具有正确的列表索引)但在应用程序中我们看到了上述内容。在重新启动时清除缓存,问题就会消失,但对于其他用户来说,我无法复制该模式。
问题是在什么情况下可能发生这样的事情,其中列表不按顺序或缺少hasMany关系的条目。
通过语言搜索用户是一种常见用例。我想知道在这个搜索期间,在条件查询中使用别名的情况下,可能只是在列表中加载匹配语言并缓存它吗?
我无法在dev或qa环境中重现这种行为。
任何指针都会非常感激。