2010-11-28 26 views
1

我的应用程序的会话包含一个用户对象,其中包含一个设置对象,其中包含属性“effectiveOrganisation”。设置对象被急切加载,并且由于Hibernate Session是每个请求的,会话中的用户对象将从Hibernate Session中分离出来。Grails:检查分离的对象是否在附加组中

我要检查wheter的“effectiveOrganisation”是设置一个附加的对象:

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

但这种测试的结果永远是假的。也许这是因为会话中的组织和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的集合中tached对象?

回答

2

它看起来像你的哈希码计算可能是问题。哈希码通常比平等计算便宜很多,因此首先进行比较。如果发生碰撞并且两个不同的对象生成相同的哈希码,则会检查equals()。但是如果两个对象具有不同的散列码,那么根据散列码/等于约定,它们被假定为不同的对象。

集合中的实例是代理 - 影响哈希码计算吗?

+0

感谢您的解释。 `equals`和`hashCode`由IntelliJ IDEA生成,我认为代码应该是正确的。 – deamon 2010-11-28 20:45:18

0

检查实例的类。散列码可能不是问题,但对象很可能是hibernate代理,这是问题。

检查的equals()被调用包含在()

而且,改变这个G:如果要

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

可能会解决它。

相关问题