2010-11-28 37 views
1

La session de mon application contient un objet utilisateur qui possède un objet settings qui contient un attribut "effectiveOrganization". Les objets settings sont chargés avec impatience et comme la Session Hibernate est par requête, l'objet utilisateur de la session est détaché de la Session Hibernate.Grails: Vérifier si un objet détaché est dans un Set attaché

Je veux vérifier wheter la « effectiveOrganisation » est dans l'ensemble d'un objet attaché:

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

Mais le résultat de ce test est toujours faux. Peut-être que c'est parce que l'organisation de la session et l'organisation du documentInstance ne sont pas des objets identiques. J'ai implémenté equals et hashCode dans la classe Organisation mais cela n'a pas aidé.

J'ai essayé le test suivant dans un contrôleur:

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") 

Le résultat surprenant est:

equals works 
contains doesn't work 

equals et hashCode se présente comme suit:

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; 
} 

Comment puis-je vérifier si un objet de la session est contenu dans l'ensemble d'un objet taché?

Répondre

2

Il semble que votre calcul de code hash soit probablement le problème. Hashcode est généralement beaucoup moins cher à calculer que l'égal, donc il est comparé en premier. S'il y a une collision et que deux objets différents génèrent le même code, alors equals() est vérifié. Mais si deux objets ont des hashcodes différents, alors selon le contrat hashcode/equals, ils sont supposés être des objets différents.

Les instances de la collection sont des proxies - cela affecte-t-il le calcul du code de hachage?

+0

Merci pour l'explication. 'equals' et' hashCode' ont été générés par IntelliJ IDEA et je pense que le code devrait être correct. – deamon

0

Vérifiez la classe des instances. Le code de hachage n'est probablement pas le problème, mais les objets sont probablement des proxies d'hibernation qui est le problème.

Vérifiez si equals() est en cours appelé au cours contient()

En outre, la modification de ce g: si à

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

Peut fixer.