我对以下问题感到困惑:
我有两个域类:Project和Link,它们之间有多对多
我使用id.hashCode
覆盖Link的hashCode方法在我的LinkService中,我写了一个动作createLinkInProject(params):
Project createLinkInProject(params){
Project project = Project.findByName('agile')
Link service = new Link(params)
project.addToLinks(service)
if (!project.save(flush:true)){
project.errors.each{log.error it}
throw new LinkControlException('An error occurred while creating a service in project', service)
}
println 'contains ? ' + project.links.contains(service)
return project
}
对我来说奇怪的是project.links.contains(service)总是假的,除非我之前添加了project.refresh()。
有人可以帮帮我吗? 认为我发现了问题:
考虑说明:
Project project = Project.findByName('agile')
Link service = new Link(params)
project.addToLinks(service)// insert into map
当服务插入map时,它的哈希码是super.hashCode(),因为在project.save()之前服务未被保存,所以它没有id。
在我执行project.save()之后,对象'service'被注入一个id值,所以现在它的哈希码被改为id.hashCode()。
然而,之前插入的对象'service'将不会使用新的哈希码自动重新插入。 (除非我做了一个project.refresh()或从数据库重新加载链接)
注意super.hashCode()和id.hashCode()在map中给出两个不同的索引,因此project.links.contains(service)总是返回false