2010-11-28 16 views
1

私のアプリケーションのセッションには、属性 "effectiveOrganisation"を含む設定オブジェクトを持つユーザーオブジェクトが含まれています。設定オブジェクトは熱心に読み込まれ、Hibernate Sessionは要求ごとに存在するため、セッション内のユーザーオブジェクトはHibernateセッションから切り離されます。Grails:デタッチされたオブジェクトがアタッチされているかどうかの確認

私は「effectiveOrganisationは」添付オブジェクトのセットであるwheterチェックしたい:

<g:if test="${session.user.settings.effectiveOrganisation in 
    documentInstance.downloadingOrganisations}"> 

しかし、このテストの結果は常にfalseです。これは、セッション内の組織とdocumentInstanceの組織が同一のオブジェクトではないためです。 OrganisationクラスにequalshashCodeを実装しましたが、それは役に立ちませんでした。

私は、コントローラで次のテストを試してみました:

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 

equalshashCode次のようになります。

私は確認することができますどのように
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のセットに含まれているタキシードオブジェクト?

答えて

2

ハッシュコードの計算がおそらく問題であるようです。ハッシュコードは通常equalsよりも計算コストがかかりますので、まず比較します。衝突があり、2つの異なるオブジェクトが同じハッシュコードを生成する場合、equals()がチェックされます。しかし、2つのオブジェクトが異なるハッシュコードを持つ場合、ハッシュコード/等価規約に従って、それらは異なるオブジェクトであるとみなされます。

コレクションのインスタンスはプロキシです - ハッシュコードの計算に影響するものは何ですか?

+0

ありがとうございます。 'equals'と' hashCode'はIntelliJ IDEAによって生成されたので、コードは正しいはずです。 – deamon

0

インスタンスのクラスを確認します。ハッシュコードはおそらく問題ではありませんが、オブジェクトはおそらくハイバネーションプロキシである可能性が高いです。また

チェック等しい場合()(含まれている時に呼び出されている)

、このグラムを変更:

g:if test="${session.user.settings.id in 
    documentInstance.downloadingOrganisations*.id}" 

には、それを修正する可能性がある場合。

関連する問題