Java 相关实体的hashCode()方法

Java 相关实体的hashCode()方法,java,jpa,hashcode,entities,Java,Jpa,Hashcode,Entities,我了解到,在使用JPA时,应该为实体实现hashCode()/equals()。 例如,Eclipse有一个很好的特性来为类生成这些方法 但我必须选择哪些领域? 我读到选择长id;实体的字段不是一个好主意。(对吗?为什么?) 在hashCode()/equals()方法中应该使用业务键(可以用来标识实体的一些实体字段,对吗?) 考虑以下情况: 1:n A和B之间的关系。。。 在hashcode()方法中使用这些引用是一个好主意吗? 如果这样做,我有时会遇到java.util.Concurrent

我了解到,在使用JPA时,应该为实体实现hashCode()/equals()。 例如,Eclipse有一个很好的特性来为类生成这些方法

但我必须选择哪些领域? 我读到选择长id;实体的字段不是一个好主意。(对吗?为什么?) 在hashCode()/equals()方法中应该使用业务键(可以用来标识实体的一些实体字段,对吗?)

考虑以下情况: 1:n A和B之间的关系。。。 在hashcode()方法中使用这些引用是一个好主意吗? 如果这样做,我有时会遇到java.util.ConcurrentModificationException或Stackoverflow异常。 那么集合变量呢?我想我不应该在hashcode()函数中使用这些函数。。。
有人能给我一些提示吗

考虑使用唯一标识对象的字段(尽可能少)。如果是一个人,可能是他的名字、中间名和姓氏。或者更好的是,如果是美国人,社会保险号码。只要表不能包含重复的实体,我就看不到使用DB ID有任何问题。通常,对象的标识不应要求检查其关联对象的标识(1:n关系)但仅限于本地字段。

应始终在主键或业务键上实现Equals和hashcode方法如果您希望遵守持久化管理器的要求,这是必要的

您可以在hashcode中实现自己的逻辑来获取唯一的数字

你可以做一些^-ing的组合 (异或)类的实例变量(换句话说,旋转它们的位),以及
也许将它们乘以一个素数。

谢谢您的回答:)据我所知,不应该使用id主键,因为在创建对象时(而不是保存到数据库中),此字段将为空。因此,每个新对象都将等于另一个新对象。问题是:如果我的实体没有任何被认为是唯一的替代字段,该怎么办?如果不是ID,我应该使用哪些字段?因此,抽象地,你如何看待两个对象是相等的?i、 若你们并没有使用DB,所以并没有ID,你们将如何定义两个bean的相等性?你只是检查每个字段吗?似乎您可能需要在问题中发布对象的结构,以便我们更好地了解正在发生的事情。