JPA / Hibernate“Composite-id类不会覆盖equals()”
我正在使用JPA并收到以下警告。 我研究了这个,并理解为什么我需要覆盖它以及Hibernate如何使用这些方法。 我仍然有一个问题:
例外:
Composite-id类不会覆盖equals()
题:
为什么Hibernate只关心没有复合ID的类? 默认情况下,如果只有一个存在,在@Id
字段上进行比较,或者是否存在更复杂的问题?
因为当实体没有复合ID时,它们只有一个基本支持类型之一(Integer,Long,String等),并且这些类已经有明确定义的equals()
(和hashCode()
)方法。
在使用复合键时使用JPA,您应该使用IdClass
或EmbeddedId
使用它们中的任何一个来创建自己的类作为复合键,以便能够使用此组合键来比较对象。 EntityManager
中的操作,键类必须覆盖equals
和hashCode
。
取决于规格:
复合主键必须对应于单个持久字段或属性,或者对应于下面描述的一组此类字段或属性。 必须定义主键类以表示复合主键。 当数据库密钥由多个列组成时,通常在从旧数据库映射时出现复合主键。
EmbeddedId
或IdClass
注释用于表示复合主键。
当使用复合主键时必须遵循。
- 主键类必须是公共的,并且必须具有公共的无参数构造函数。
- 主键类必须是可序列化的。
- 主键类必须定义
equals
和hashCode
方法。 这些方法的值相等的语义必须与键映射到的数据库类型的数据库相等性一致。