有很多问题与如何实现由 Hibernate 管理的实体的良好 equals 和 hashcode 函数有关。但是,我没有找到任何解决我的问题的方法:
我有一个没有业务密钥的实体类。它有一个生成的主键、一些不能用于标识的属性以及与其他实体类的多个关联。我总是尝试坚持 Hibernate 的建议(业务密钥的平等),所以我不想检查生成的 Id。这导致检查 2 个唯一标识我的实体类的关联。但这会导致这两个关联必须定义为 FetchType.EAGER。
对于我的 equals 函数,我可以考虑其他替代方法吗?
更新:
您如何看待 Hibernate 中“通用”equals 方法的以下解决方案?
public boolean equals(Object object) {
if (this == object) return true;
if (! (object instanceof AbstractEntity)) return false;
AbstractEntity other = (AbstractEntity) object;
if (getId() == null && other.getId() != null) return false;
if (getId() != null && other.getId() == null) return false;
if (getId() == null && other.getId() == null) return uuid == other.uuid;
return getId().longValue() == other.getId().longValue();
}
这样,实体可以安全地在集合中使用。当实体被分离时,它通过 ID 进行比较。当实体是瞬态的时,它会通过生成的 UUID 进行比较。所以我看到的唯一缺点是瞬态实体是通过 UUID 而不是业务密钥进行比较的。
非常欢迎任何建议!