如何在Hibernate上比较同一实体的延迟加载对象?

时间:2012-04-19 08:25:59

标签: java hibernate lazy-loading

在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()方法并隐藏这个混乱。

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

注意:我已经检查了Stack Overflow问题 Lazy-loaded NHibernate properties in Equals and GetHashCode 等等。我不是要求解决方法。我想提出这个问题,以便提出一个更好或更准确的解决方案,如果存在的话。

2 个答案:

答案 0 :(得分:1)

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

instanceA.getId()返回什么?

如果int

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

应该运作良好。

如果Integer则必须使用

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

这可能是你的问题;如果不是我不知道为什么比较ID不起作用。我总是比较ID - 即使是延迟加载 - 它运行良好。

答案 1 :(得分: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();
}