1

我遇到了一个问题,即在正常运行或调试时调用.contains()我的一个域类的hasMany关系不一样。情况如下:

我有 2 个域对象,A并且B. A与 有hasMany关系B

class A {
    ...
    static hasMany = [bees: B]
    ...
}

现在,在执行我的一个过滤器期间,我从 spring 安全服务中获取了我当前的用户。该用户还包含一个B. 我的过滤器应该做的是检查B用户中的实例是否包含在A.

假设 的实例B实际上是指同一个对象(因为它们是)。

现在,问题出现了。来电:

if (instanceOfA.bees.contains(user.instanceOfB)) {
    println 'success'
} else {
    println 'failure'
}

failure在正常(或不单步执行代码的调试)执行期间打印。但是,如果我在此处设置断点并单步执行代码,它会正确执行contains()并打印success.

我也实施了equals,hashCodecompareTo试图解决这个问题,但行为相同。

4

4 回答 4

3

这通常是由于延迟加载或缓存。使用instanceOfA.bees.id.contains(user.instanceOfB.id)它总是有效的。

于 2013-09-03T16:44:17.710 回答
2

也许您的user.instanceOfB对象是休眠代理对象,因此不是真正的B。您可以使用调试器或打印来检查它user.instanceOfB.getClass()

您可以使用GrailsHibernateUtil.unwrapIfProxy(proxyObject)从代理获取真实对象。

于 2013-09-03T16:59:05.393 回答
1

我会用 HQL 做到这一点:

A.executeQuery("select a from A a join a.bees as b where b = :b and a = :a", [a: instanceOfA, b: user.instanceOfB])
于 2013-09-03T17:33:06.267 回答
1

因此,似乎使用 Groovy 转换注释之一似乎可以解决问题。只需添加:

// uid is a uniqe UUID we use to identify with other systems.
@EqualsAndHashCode(includes = ["id", "uid"])

成功了。IDE生成的方法(使用相同的字段)似乎有点奇怪......

于 2013-09-04T05:29:39.807 回答