0

在 Hibernate 上比较同一实体的延迟加载对象的最佳方法是什么?

//instanceC and instanceD are different objects of different classes

instanceC.getA().equals(instanceD.getA()) // false

instanceC.getA().getId() == insttanceD.getA().getId() // false!

所以我最后要做的是:

int idA=instanceC.getA().getId();
int idB=instanceD.getA().getId();

a==b // true

当然,它看起来非常弯曲。所以我最后决定是重写该equals()方法并隐藏这个烂摊子。

有没有更好(或正确)的解决方案?

注意:我检查了堆栈溢出问题Lazy-loaded NHibernate properties in Equals 和 GetHashCode等等。我不是要求解决方法。我想提出这个问题,以便提出更好或更准确的解决方案(如果存在)。

4

2 回答 2

1

比较 id 是正确的方法(但前提是数据库中 id 列上存在唯一索引)。唯一索引确保它是同一个实体。(一个例外是,如果您想比较两个实例以查看是否有修改,例如您想保存 - 那么您必须比较所有成员变量。)

返回什么instanceA.getId()

如果int那时

instanceC.instanceA.getId()==insttanceD.instanceB.getId() 

应该运作良好。

如果Integer那么你必须使用

instanceC.instanceA.getId().equals(insttanceD.instanceB.getId())

可能是你的问题;如果不是,我不知道为什么 id 的比较不起作用。我总是比较 ids——即使是延迟加载——而且效果很好。

于 2012-04-19T09:42:33.583 回答
0

要比较一个实体,您总是比较识别属性(在大多数情况下,一个名为 Id 的字段)。这是使它成为一个实体的重要组成部分。

id 当然永远不会延迟加载,所以这不是问题。您的实体的等号和哈希码必须以这样一种方式实现,即它们只考虑 id 和 id。我相信hibernate甚至期望它能够正常执行。

正常的(如果你问我的话,也是最好的)方法是:

equals(Object other){
        if (this == o) return true;
        if (o==null) return false;
        if (!Entity.class.isAssignableFrom(other.getClass()) return false;
        Entity otherEntity = (Entity) other;

        if (otherEntity.getId() == getId()) return true;
        if (otherEntity.getId() == null) return false;
        return otherEntity.getId().equals(getId());
}

hashCode(){
   if (getId()) == null return super.hashCode();
   return getId().hashCode();
}
于 2012-04-19T09:07:23.473 回答