0

我对以下问题感到困惑:

我有两个域类:项目和链接,它们之间有一个多对多

我使用 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

4

0 回答 0