什么问题/陷阱,必须重写时,必须考虑equals和hashCode?
这里有一些 关于JPA实体的讨论,以及哪些hashCode()/ equals()实现应该用于JPA实体类.大多数(如果不是全部)它们依赖于Hibernate,但我想讨论它们JPA实现中性(顺便说一下,我使用的是EclipseLink).
所有可能的实现都有各自的优点和缺点:
hashCode()/equals()合同一致性(不变性)为List/ Set操作据我所知,有三种选择:
Object.equals()和Object.hashCode()
hashCode()/ equals()工作hashCode()/ equals()坏了hashCode()/ equals()坏了我的问题是:
更新1:
通过" hashCode()/ equals()被破坏",我的意思是连续hashCode()调用可能会返回不同的值,也就是(当正确实施)不在的感觉打破ObjectAPI文档,但是当试图从检索改变实体引起的问题Map, Set或其他基于哈希的Collection.因此,在某些情况下,JPA实现(至少EclipseLink)将无法正常工作. …
我正在使用hibernate并需要覆盖equals和hashCode().我选择使用google-guava的equals和hashCode助手.
我想知道我在这里是否遗漏了什么.
我有id/image和filePath的 get/set方法.
@Entity
@Table(name = "IMAGE")
public class ImageEntity {
private Integer idImage;
private String filePath;
@Override
public int hashCode() {
return Objects.hashCode(getFilePath());
}
@Override
public boolean equals(final Object obj) {
if(obj == this) return true;
if(obj == null) return false;
if(obj instanceof ImageEntity){
final ImageEntity otherImage = (ImageEntity) obj;
return Objects.equal(getFilePath(), otherImage.getFilePath());
}
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:
进入继承并在这里有一个样本
我正在阅读Eric Evans关于DDD的书,我对以下引用有疑问.equals()如果不使用属性,如何制作方法?我正在使用JPA,并且我有一个唯一的id属性,但在实际持久保存实体之前不会设置.所以你会怎么做?我已经基于属性实现了equals方法,我理解为什么你不应该因为它在我的项目中失败了.
关于实体的部分:
当一个对象通过其标识而不是其属性进行区分时,将该主要对象定义为模型中的定义.保持课堂定义简单,重点关注生命周期的连续性和身份.定义区分每个对象的方法,无论其形式或历史如何.警告要求按属性匹配对象的要求.定义一个保证为每个对象生成唯一结果的操作,可以通过附加保证唯一的符号.这种识别方法可能来自外部,也可能是由系统创建的任意标识符,但它必须与模型中的标识区别相对应.模型必须定义相同的东西意味着什么.
http://www.amazon.com/Domain-Driven-Design-Tackling-Complexity-Software/dp/0321125215
java ×4
equals ×2
hashcode ×2
eclipselink ×1
guava ×1
hibernate ×1
identity ×1
java-ee ×1
jpa ×1
overriding ×1