Grails:检查分离的对象是否在附加的Set中

时间:2010-11-28 12:16:18

标签: java grails set equals hashcode

我的应用程序的会话包含一个用户对象,其中包含一个包含属性“effectiveOrganisation”的设置对象。设置对象是急切加载的,因为Hibernate Session是按请求进行的,所以会话中的用户对象与Hibernate Session分离。

我想查看“effectiveOrganisation”是否在附加对象集中:

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

但是这次测试的结果总是错误的。也许这是因为会话中的组织和documentInstance的组织不是相同的对象。我在equals课程中实施了hashCodeOrganisation,但没有帮助。

我在控制器中尝试了以下测试:

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

如何检查会话中的对象是否包含在附加对象的集合中?

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

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

检查在contains()

期间是否正在调用equals()

另外,更改此g:if to

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

可以解决它。