gpt4 book ai didi

java - Hibernate javassist 代理和 `Object#equals`

转载 作者:搜寻专家 更新时间:2023-10-30 21:45:22 25 4
gpt4 key购买 nike

在 Java 中为 UDT 提供 #equals 实现时,其中一个条件是传递的参数对象必须是当前类的实例,否则我们会快速失败 return false 参见 Effective Java (EJ2)。但是,在使用 Hibernate 4 时,由于 #equals 条件将失败的延迟加载,我们最终可能会使用 javassist 代理实例。克服这个问题的最佳选择是什么?我能想到的几个选择是:

  • 扩展equals 实现以考虑代理情况。缺点:可维护性收费、对 Hibernate 代理基础设施的硬连线依赖、hacky、实体或域模型应该与正在使用的 ORM 无关,即因为它们可能在不需要 ORM 的不同上下文中重用,例如 Swing 用户界面。
  • 在调用equals 之前检查它是否是一个代理。缺点:并非总是可行,即处理集合和隐式调用 equals,例如 Map。
  • 避免使用延迟加载。缺点:在所有用例中既不合理也不高效。

更新

再次回顾 EJ2 我相信以下将适用于所有场景(Type-Type、Type-Proxy、Proxy-Type 和 Proxy-Proxy),但正如下面的评论之一所指出的,如果 Type与完全不同的类型进行比较,例如Person.equals(Employee) 并且都使用相同的 equals EJ2 标准。

    if (this.getClass() != anObject.getClass())
{
return anObject.equals(this);
}

最佳答案

我遇到了同样的问题。我修复的方法是更改​​ .equals-method。

@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (!getClass().isAssignableFrom(obj.getClass()))
return false;
AbstractEntity other = (AbstractEntity) obj;
if (getId() == null) {
if (other.getId() != null)
return false;
} else if (!getId().equals(other.getId()))
return false;
return true;

诀窍是不要将类比较为相同,而是使用 isAssignableFrom 方法。另一个技巧是不使用直接属性 (other.id),而是使用 get 方法 (other.getId())

关于java - Hibernate javassist 代理和 `Object#equals`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14024444/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com