我有一个抽象ID和版本属性的BaseEntity。此类还实现哈希码,并基于PK(id)属性进行等于。
BaseEntity{
Long id;
Long version;
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
return result;
}
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
BaseEntity other = (BaseEntity) obj;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
return true;
}
}
现在两个实体A和B扩展了BaseEntity,如下所示
A extends BaseEntity{
`B b`
B getB(){return b;)
void setB(B b){this.b=b;}
}
B extends BaseEntity{
}
object b1;
object a1;
a1.set(b1);
session.save(a1) //cascade save;
关闭会话以懒惰的b加载a并尝试a1.getB()。equals(b1)给出false,但如果我与a1.getB()。getId()。equals(b1.getId())比较,则得出真正的奇怪!我认为是因为Java辅助代理对象,无论如何要解决此问题?
为了能够延迟加载a.b
关联,Hibernate将b
字段设置a
为代理。代理是扩展B的类的实例,但不是B。因此,将非代理B实例与代理B实例进行比较时,您的equals()方法将始终失败,因为它会比较两个对象的类:
if (getClass() != obj.getClass())
return false;
对于Hibernate实体,应将其替换为
if (!(obj instanceof B)) {
return false;
}
另外请注意
equals()
并hashCode()
通过使用ID,而是通过使用天然标识符。使用ID实施它可能会引起问题,因为实体在保存并生成ID之前没有IDa.b
在加载之前不知道是哪种类型(B1或B2)。因此a.b
将初始化为代理,该代理是B的子类,但不是B1或B2的子类。因此,hashCode()
和equals()
方法应在B中实现,但不能在B1和B2中覆盖。如果两个B实例是B实例且具有相同的标识符,则应视为相等。在内部Hibernate时,假设使用。那么会不会消耗更多的内存呢?和如何在内部工作?
标题说明了一切。我的问题是关于不同的字符串等价方法的效率。我经常使用<代码>。equalsIgnoreCase(String str),因为我对它很有兴趣。但我开始怀疑这是否是寻找字符串之间等价性的最有效方法。在我看来,正在调用一种大小写转换方法或,然后在其定义中调用,但我可能错了。那么,以下哪种方法在以下情况或任何情况下更有效?
我试图观察下面的JPA2/Hibernate4代理行为, //延迟加载的循环实体: //持久实体: //输出: //加载外部实体: //输出: 令我惊讶的是,上面加载的外部实体仍然是普通实体,但我希望它是,这是由于造成的。我可能错过了一些东西,那怎么做才对呢?一个简单而具体的例子是非常感谢! @编辑 根据的回答,我修改了代码,并在下面的SE模式下对其进行了调试,既不能生成,也不能代理
我想使用lombok:EqualsAndHashCode,只考虑Id,设置在Item class上,在分层结构之上。这些是我的课程: 1.流程: 2.资源流动: 3.项目: 这是正确的还是有其他方法可以通过Id来比较像Process这样的项的子项?我在孩子中使用了callSuper=true和onlyExplicitlyIncluded=true,设置了@EqualsAndHashCode。包含父
我用以下方式解决了一个问题: 它起作用了。问题是所有这些if语句都让我厌烦,我也无法想象它们是世界上最快的东西。我想这样解决它: 问题是bool8是一个保留类型,而不是一个真正的类型,所以方法1已经过时了。然而,方法2不能正确工作。我怀疑原因与它的第一行有关。这 我的问题是,是否有任何方法可以以更干净、更并行的方式重写原始代码? 谢谢,
问题内容: 我正在尝试编写一个HQL查询,该查询将计算项目的平均评分。当给定项目没有评分时,我希望查询返回0而不是null- 这样我就可以将查询用作子查询。那有可能吗?是否有与IFNULL或NVL等效的HQL? 问题答案: COALESCE 是官方的等效方法。 它返回其参数的第一个非null。 例: 链接维基百科