在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 等等。我不是要求解决方法。我想提出这个问题,以便提出一个更好或更准确的解决方案,如果存在的话。
答案 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();
}