在 Java 中为 UDT提供#equals
实现时,条件之一是传递的参数对象必须是当前类的实例,否则我们会快速失败,return false
请参阅Effective Java (EJ2)。但是,在使用 Hibernate 4 时,由于延迟加载,我们最终会得到 javassist 代理实例,这种#equals
情况将失败。克服这个问题的最佳选择是什么?我能想到的几个选择是:
- 扩展
equals
实现以考虑代理情况。缺点:可维护性代价、对 Hibernate 代理基础设施的硬连线依赖、hacky、实体或域模型应该与所使用的 ORM 无关,即因为它们可能在不需要 ORM 的不同上下文中重用,例如 Swing UI。 - 在调用之前检查它是否是代理
equals
。缺点:并不总是可能的,即处理集合和隐式调用equals
,例如 Map。 - 避免使用延迟加载。缺点:在所有用例中都不合理也不高效。
更新
再次回顾 EJ2 我相信以下内容适用于所有场景(Type-Type、Type-Proxy、Proxy-Type 和 Proxy-Proxy),但正如下面的评论之一所指出的,如果将 Type 与完全不同的类型,例如Person.equals(Employee)
,两者都使用相同的等于 EJ2 标准。
if (this.getClass() != anObject.getClass())
{
return anObject.equals(this);
}