【发布时间】:2014-03-25 21:18:03
【问题描述】:
我正在使用 JPA 并收到以下警告。我已经对此进行了研究,并了解了为什么我需要覆盖它以及 Hibernate 如何使用这些方法。不过我还有一个问题:
例外:
Composite-id 类不覆盖 equals()
问题:
为什么 Hibernate 只关心没有复合 ID 的类?如果只有一个存在,默认情况下会在 @Id 字段上进行比较,还是这里发生了更复杂的事情?
【问题讨论】:
我正在使用 JPA 并收到以下警告。我已经对此进行了研究,并了解了为什么我需要覆盖它以及 Hibernate 如何使用这些方法。不过我还有一个问题:
例外:
Composite-id 类不覆盖 equals()
问题:
为什么 Hibernate 只关心没有复合 ID 的类?如果只有一个存在,默认情况下会在 @Id 字段上进行比较,还是这里发生了更复杂的事情?
【问题讨论】:
因为当实体没有复合 ID 时,它们只有一个,是一种基本支持的类型(整数、长整型、字符串等),并且这些类已经有一个明确定义的 equals() (和hashCode())方法。
【讨论】:
在使用复合键时使用 JPA,您应该使用 IdClass 或 EmbeddedId 使用它们中的任何一个,您需要创建一个自己的类作为复合键,以便能够使用它来比较对象EntityManager 中的多个操作所需的复合键,键类必须覆盖 equals 和 hashCode。
取自规格:
复合主键必须对应于单个持久字段或属性,或者对应于如下所述的一组此类字段或属性。必须定义一个主键类来表示一个复合主键。当数据库键由多个列组成时,通常会在从遗留数据库映射时出现复合主键。
EmbeddedId或IdClass注解用于表示复合主键。
并且在使用复合主键时必须遵循。
equals 和hashCode 方法。这些方法的值相等语义必须与键映射到的数据库类型的数据库相等性一致。【讨论】: