私は以下の問題に混乱していました:
私は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 を返すことに注意してください。