私のアプリケーションのセッションには、属性 "effectiveOrganisation"を含む設定オブジェクトを持つユーザーオブジェクトが含まれています。設定オブジェクトは熱心に読み込まれ、Hibernate Sessionは要求ごとに存在するため、セッション内のユーザーオブジェクトはHibernateセッションから切り離されます。Grails:デタッチされたオブジェクトがアタッチされているかどうかの確認
私は「effectiveOrganisationは」添付オブジェクトのセットであるwheterチェックしたい:
<g:if test="${session.user.settings.effectiveOrganisation in
documentInstance.downloadingOrganisations}">
しかし、このテストの結果は常にfalseです。これは、セッション内の組織とdocumentInstanceの組織が同一のオブジェクトではないためです。 Organisation
クラスにequals
とhashCode
を実装しましたが、それは役に立ちませんでした。
私は、コントローラで次のテストを試してみました:
def org = session.user.settings.effectiveOrganisation
doc.downloadingOrganisations.each{
if(it.equals(org))
println("equals works")
}
if(! doc.downloadingOrganisations.contains(org))
println("contains doesn't work")
驚くべき結果は次のとおりです。
equals works
contains doesn't work
equals
とhashCode
次のようになります。
boolean equals(o) {
if (this.is(o)) return true;
if (getClass() != o.class) return false;
Organisation that = (Organisation) o;
if (name != that.name) return false;
if (selfInspecting != that.selfInspecting) return false;
return true;
}
int hashCode() {
int result;
result = (name != null ? name.hashCode() : 0);
result = 31 * result + (selfInspecting != null ? selfInspecting.hashCode() : 0);
return result;
}
セッションからのオブジェクトが、atのセットに含まれているタキシードオブジェクト?
ありがとうございます。 'equals'と' hashCode'はIntelliJ IDEAによって生成されたので、コードは正しいはずです。 – deamon