我对以下问题感到困惑:
我有两个域类:项目和链接,它们之间有一个多对多
我使用 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
当服务插入地图时,它的哈希码是 super.hashCode(),因为服务直到 project.save() 才被保存,所以它没有 id。
在我做 project.save() 之后,对象“服务”被注入了一个 id 值,所以现在它的哈希码被更改为 id.hashCode()。
但是,之前插入的对象“服务”不会使用新的哈希码自动重新插入。 (除非我执行 project.refresh() 或从数据库重新加载链接)
注意 super.hashCode() 和 id.hashCode() 在地图中给出了两个不同的索引,所以 project.links.contains(service) 总是返回 false