对象相等/hashcode与jpa/hibernate实体相等/hashcode

ckocjqey  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(490)

在阅读了一点关于这个主题的内容之后,我对@entity equality的hibernate/jpa需求有些迷茫。我真的需要调整@equalsandhashcode以使我的实体在2020年仍然基于db唯一性吗?那么@id元注解有什么意义呢?
我需要能够在对象级别比较我的实体,所以现在我只是根据@id之外的所有字段实现了equalsandhashcode。
如果我继续这样做,我到底会面临哪些问题?如果hibernate出于某种原因试图存储或混合两个具有相同@id但与我的实现不相等的实体,db不会抛出异常吗?真的有风险吗?我敢肯定,过去我看到过很多项目都有适当的测试,没有人定义任何特定的@equalsandhashcode,所以默认情况下只是比较示例,这些项目通过了所有类型的crud测试,而且在生产中没有bug

toe95027

toe950271#

基本上,当实体之间存在双向关系时,会遇到一些问题。例如,如果entity1 @OneToMany 访问entity2,并且entity2具有 @ManyToOne 访问entityid,并且这两个实体都具有 @EqualsAndHashcode 不指定字段(即。, equals 以及 hashcode 为所有字段(包括关系字段)生成。在这种情况下,您将有一个循环引用,因此 StackOverflow 例外。
为了避免这种情况,您只能依赖于具有 @Id 用于构造 equals 以及 hashcode (hibernate文档中有一些这种方法的例子)。但在这种情况下,您会遇到另一种问题,例如,如果您将具有自动生成id的临时实体存储在一个集合中(作为某个父实体的子实体),它将无法正常工作,因为id字段将被忽略 null 在这种情况下。可能,您需要在中使用其他字段 equals 以及 hashcode 在这种情况下。
所以,这个问题没有正确的答案。每次构建实体时都需要做出决策。

相关问题