0

私は以下の問題に混乱していました:

私は2つのドメインクラスを持っています:プロジェクトとリンクの間に多対多があります

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.refresh() を追加しない限り、project.links.contains(service) が常に false であることです。

誰かが私を助けることができますか?と思う


私は問題を見つけました:

指示を検討してください:

Project project = Project.findByName('agile')
Link service = new Link(params)    
project.addToLinks(service)// insert into map

サービスがマップに挿入されると、サービスは project.save() まで保存されないため、ハッシュ コードは super.hashCode() であり、ID がありません。

project.save() を実行した後、オブジェクト 'service' に id 値が挿入されるため、ハッシュ コードが id.hashCode() に変更されます。

ただし、以前に挿入されたオブジェクト「サービス」は、新しいハッシュ コードで自動的に再挿入されません。 (project.refresh() を実行するか、データベースからリンクをリロードしない限り)

super.hashCode() と id.hashCode() はマップに 2 つの異なるインデックスを与えるため、project.links.contains(service) は常に false を返すことに注意してください。

4

0 に答える 0