在阅读了一点关于这个主题的内容之后,我对@entity equality的hibernate/jpa需求有些迷茫。我真的需要调整@equalsandhashcode以使我的实体在2020年仍然基于db唯一性吗?那么@id元注解有什么意义呢?
我需要能够在对象级别比较我的实体,所以现在我只是根据@id之外的所有字段实现了equalsandhashcode。
如果我继续这样做,我到底会面临哪些问题?如果hibernate出于某种原因试图存储或混合两个具有相同@id但与我的实现不相等的实体,db不会抛出异常吗?真的有风险吗?我敢肯定,过去我看到过很多项目都有适当的测试,没有人定义任何特定的@equalsandhashcode,所以默认情况下只是比较示例,这些项目通过了所有类型的crud测试,而且在生产中没有bug
1条答案
按热度按时间toe950271#
基本上,当实体之间存在双向关系时,会遇到一些问题。例如,如果entity1
@OneToMany
访问entity2,并且entity2具有@ManyToOne
访问entityid,并且这两个实体都具有@EqualsAndHashcode
不指定字段(即。,equals
以及hashcode
为所有字段(包括关系字段)生成。在这种情况下,您将有一个循环引用,因此StackOverflow
例外。为了避免这种情况,您只能依赖于具有
@Id
用于构造equals
以及hashcode
(hibernate文档中有一些这种方法的例子)。但在这种情况下,您会遇到另一种问题,例如,如果您将具有自动生成id的临时实体存储在一个集合中(作为某个父实体的子实体),它将无法正常工作,因为id字段将被忽略null
在这种情况下。可能,您需要在中使用其他字段equals
以及hashcode
在这种情况下。所以,这个问题没有正确的答案。每次构建实体时都需要做出决策。