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