【问题标题】:Grails - List returns proxied classes instead of domain classesGrails - 列表返回代理类而不是域类
【发布时间】:2014-11-12 00:04:40
【问题描述】:

我注意到,在 Grails 中对域类调用 list 时,返回的结果是代理实例,而不是实际的域类实例。

示例

println User.list()

[ com.mypackage.security.User_$$_javassist_28 ]

在将这些代理类之一的实例与匹配的域类实例进行比较时,我收到错误的相等结果。

Groovy“与 Java 的区别”文档指出:

== 表示所有类型都相等。 ... 所以为了简单起见 == 在 Groovy 中表示 equals()

然而,当将域类与这些代理类之一进行比较时,这似乎并不正确。

有人可以对此提供一些见解吗?

有没有办法调用列表并接收实际的域类实例?

我宁愿不必提供自定义的 getHashCode 和 equals 实现来解决这个问题。

谢谢。

【问题讨论】:

  • 你重写了域类中的equals()和hashCode()吗?
  • @evanwong - 不,我没有覆盖 equals 或 hashCode

标签: java hibernate grails groovy


【解决方案1】:

我认为你不能让它使用 list() 返回不同的类型,== return false 应该与 list 返回的类型无关。

在 Java 中,要使相同类型的 2 个对象相等,您必须实现 equalshashCode。即使您可以使用 == 来测试相等性,Groovy 也有相同的内容。

支持你的平等问题。

== 表示所有类型都相等。 ... 所以为了简单起见 == 在 Groovy 中表示 equals()

这不是故事的全部。

Here 是一个更好的解释。

在两个对象可能通过普通的 Groovy “强制”机制被认为“相等”的情况下,== 运算符会将它们报告为相等; .equals() 方法不会这样做,如果这样做会破坏 Java 对 equals 方法的常规规则。

现在,既然您想避免实现,您或许可以利用 Groovy AST。 您可以使用 @EqualsAndHashCode 注释该类,让它为您处理它。 Grooydoc here.

【讨论】:

    猜你喜欢
    • 2013-04-14
    • 2012-11-10
    • 2021-07-05
    • 1970-01-01
    • 1970-01-01
    • 2022-06-12
    • 1970-01-01
    • 1970-01-01
    • 2012-06-23
    相关资源
    最近更新 更多