JPA/Hibernate"Composite-id类不会覆盖equals()"

Joh*_*0te 17 java jpa

我正在使用JPA并收到以下警告.我研究了这个,并理解为什么我需要覆盖它以及Hibernate如何使用这些方法.我仍然有一个问题:

例外:

Composite-id类不会覆盖equals()

题:

为什么Hibernate只关心没有复合ID的类?@Id如果只有一个存在,或者这里有更复杂的东西,它是否默认在该字段上进行比较?

JB *_*zet 15

因为当实体没有复合ID时,它们只有一个基本支持类型(Integer,Long,String等),并且这些类已经有一个明确定义的equals()(和hashCode())方法.

  • 如果两个表之间有多对多关联,使用连接表,那么实体之间应该有一个ManyToMany关联.无需映射连接表.该协会处理它.阅读文档. (4认同)
  • 你应该避免使用复合键.这就是你应该做的.如果你真的不能,因为你的目标是一个无法改变的现有架构,那么你应该定义一个PK类,是的. (2认同)

Koi*_*oer 5

在使用复合键时使用 JPA,您应该使用IdClassEmbeddedId使用它们中的任何一个,您需要创建一个充当复合键的自己的类,以便能够使用此复合键来比较对象,这是其中的多个操作所需的在EntityManager这关键的类必须重写equalshashCode

从规格中获取:

复合主键必须对应于单个持久字段或属性,或者对应于如下所述的一组此类字段或属性。必须定义主键类来表示复合主键。当数据库键由多个列组成时,从旧数据库映射时通常会出现复合主键。的EmbeddedIdIdClass注解用于表示一个复合主键。

并且在使用复合主键时必须遵循。

  1. 主键类必须是公共的,并且必须有一个公共的无参数构造函数。
  2. 主键类必须是可序列化的。
  3. 主键类必须定义equalshashCode方法。这些方法的值相等的语义必须与键映射到的数据库类型的数据库相等一致。

  • 所以,我不能有一个包含多个 @Id 列的类,而只是覆盖等于那里? (4认同)