我一直面临着以下代码块以奇怪的方式表现的情况。在下面的代码片段中,当我尝试在我的taglib中对案例工作流的活动列表进行排序时,它执行db update而不是仅仅排序数据。它会更新工作流行的版本。 你能告诉我我错过了什么吗? 非常感谢快速帮助。
TagLib:
class CaseFormTagLib {
static namespace = 'caseform'
def caseForm = { attr, body ->
def caseWorkflow = CaseWorkflow.read(attr.workflowId)
//Line causing issue
def activityList = caseWorkflow?.sortedActivityList
}
}
域名:
class CaseWorkflow {
List caseActivityList
static hasMany = [caseActivityList: CaseActivity]
@Transient
def getSortedActivityList(){
Collections.sort(this.caseActivityList)
return this.caseActivityList
}
}
class CaseActivity implements Comparable {
/**
* Activity Id
*/
Integer activityId
@Override
public int compareTo(obj) {
if(!obj || !obj.activityId) {
return 1
} else if (!this.activityId) {
return -1
} else {
return this.activityId.compareTo(obj.activityId)
}
}
}
答案 0 :(得分:0)
此行为是因为taglib中使用的read()
。除非对其关联进行更改,否则read()
不会自动flush
域到数据库。
在这种情况下,由于您要对关联进行排序,因此会对其进行脏检查 关联,最后自动刷新对象。通过以上链接阅读说明,主要是:
但是有一个例外 - 任何相关的集合, 例如,作者的书籍集将参加 自动冲洗和脏污检测。这是因为映射 集合的处理方式与常规属性不同 独立于包含域管理自己的脏检查 类。
此外,默认情况下,关联是域类中的Set
。如果您希望对关联进行排序,那么您可以使它们SortedSet
使Comparable
的工作方式与您为CaseActivity
定义的方式相同:
class CaseWorkflow {
SortedSet caseActivityList
static hasMany = [caseActivityList: CaseActivity]
}
是否必须使用List
?