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