Java 对象相等/哈希代码与JPA/Hibernate实体相等/哈希代码

Java 对象相等/哈希代码与JPA/Hibernate实体相等/哈希代码,java,hibernate,jpa,spring-data-jpa,spring-data,Java,Hibernate,Jpa,Spring Data Jpa,Spring Data,在读了一点关于这个主题的内容后,我对@Entity equality的Hibernate/JPA要求有些迷茫。我真的需要调整@EqualsAndHashCode,使我的实体在2020年仍然基于db唯一性而相等吗?那么@Id元注释的意义是什么 我需要能够在对象级别比较我的实体,所以现在我只是根据@Id之外的所有字段实现了EqualsAndHashCode 如果我继续这样做,我会面临哪些问题?如果由于某种原因Hibernate试图存储或混合两个具有相同@Id但与我的实现不相等的实体,db不会抛出异常

在读了一点关于这个主题的内容后,我对@Entity equality的Hibernate/JPA要求有些迷茫。我真的需要调整@EqualsAndHashCode,使我的实体在2020年仍然基于db唯一性而相等吗?那么@Id元注释的意义是什么

我需要能够在对象级别比较我的实体,所以现在我只是根据@Id之外的所有字段实现了EqualsAndHashCode


如果我继续这样做,我会面临哪些问题?如果由于某种原因Hibernate试图存储或混合两个具有相同@Id但与我的实现不相等的实体,db不会抛出异常吗?这真的是一种风险吗?我敢肯定,我在过去看到过很多项目进行了适当的测试,没有人定义任何特定的@EqualsAndHashCode,因此默认情况下只是比较实例,这些项目通过了各种CRUD绿色测试,基本上在生产中没有bug,当实体之间存在双向关系时,您会遇到一些问题。例如,如果Entity1具有对Entity2的
@OneToMany
访问权限,Entity2具有对EntityId的
@manytone
访问权限,并且这两个实体都具有
@EqualsAndHashcode
而不指定字段(即,为所有字段(包括关系字段)生成
equals
hashcode
)。在这种情况下,您会有一个循环引用,因此会出现
StackOverflow
异常

为了避免这种情况,您只能依赖于具有
@Id
的字段来构造
equals
hashcode
(hibernate文档中有一些这种方法的示例)。但是在这种情况下,您会遇到另一种问题,例如,如果您将具有自动生成id的临时实体存储在一个集合中(作为某个父实体的子实体),它将无法正常工作,因为在这种情况下,id字段将为
null
。在这种情况下,您可能需要在
equals
hashcode
中使用一些其他字段


所以,这个问题没有正确的答案。每次构造实体时都需要做出决定。

感谢您的回答,现在,我选择了第一种方法,并通过放置EqualsAndHashCode.Includes修复了循环依赖关系。不包括RealStand对象,包括仅考虑散列的本地表FK字段ID的自定义吸收器。我没有任何自动生成的字段,所以我认为我在玩安全游戏。是的,我倾向于在代码中执行几乎相同的操作。我想补充一点,同样的“循环”问题也会因为Lombok的
@ToString
注释而发生,所以不要忘记为该注释添加排除项(如果您使用它)。无论如何,我不确定这个答案是否完整,或者我们排除了不适用的情况,