覆盖多对多域类的哈希码

时间:2013-06-04 13:20:15

标签: grails gethashcode

我对以下问题感到困惑:

我有两个域类: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

0 个答案:

没有答案