我的应用程序的会话包含一个用户对象,其中包含一个包含属性“effectiveOrganisation”的设置对象。设置对象是急切加载的,因为Hibernate Session是按请求进行的,所以会话中的用户对象与Hibernate Session分离。
我想查看“effectiveOrganisation”是否在附加对象集中:
<g:if test="${session.user.settings.effectiveOrganisation in
documentInstance.downloadingOrganisations}">
但是这次测试的结果总是错误的。也许这是因为会话中的组织和documentInstance的组织不是相同的对象。我在equals
课程中实施了hashCode
和Organisation
,但没有帮助。
我在控制器中尝试了以下测试:
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;
}
如何检查会话中的对象是否包含在附加对象的集合中?
答案 0 :(得分:2)
看起来您的哈希码计算可能是个问题。哈希码通常比平等便宜很多,因此首先进行比较。如果发生冲突并且两个不同的对象生成相同的哈希码,则检查equals()。但是如果两个对象具有不同的哈希码,则根据哈希码/等于契约,它们被假定为不同的对象。
集合中的实例是代理 - 是否影响哈希码计算?
答案 1 :(得分:0)
检查实例的类。哈希代码可能不是问题,但对象很可能是hibernate代理,这是问题。
检查在contains()
期间是否正在调用equals()另外,更改此g:if to
g:if test="${session.user.settings.id in
documentInstance.downloadingOrganisations*.id}"
可以解决它。