JPA:使用复合主键进行映射关系

JPA: Using composite primary keys for map relations

在地图 relation mapping example 之后,我

员工

ID  FIRSTNAME   LASTNAME    SALARY
1   Bob         Way         50000
2   Sarah       Smith       60000

PHONE

ID  OWNER_ID    PHONE_TYPE  AREACODE    NUMBER
1   1           home        613         792-7777
2   1           cell        613         798-6666
3   2           home        416         792-9999
4   2           fax         416         798-5555

映射键列关系注释示例

@Entity
public class Employee {
  @Id
  private long id;
  ...
  @OneToMany(mappedBy="owner")
  @MapKeyColumn(name="PHONE_TYPE")
  private Map<String, Phone> phones;
  ...
}

@Entity
public class Phone {
  @Id
  private long id;
  ...
  @ManyToOne
  private Employee owner;
  ...
}

有什么方法可以表明 OWNER_ID 和 PHONE_TYPE 是复合主键吗?

无法发出复合主键信号,因为 PHONE_TYPE 是 Employee class 中 Map 的一部分,而 OWNER_id 是 OWNER_id 中 Map 的一部分Phoneclass。除此之外,这也不是您的主键:主键是 id 属性 (如您所拥有的)。您实际需要的是为这两列指定一个唯一键。为此,一种解决方案是放弃 Employee class 中的 Map 并移动 Phone class 中的 phoneType,其中然后您可以添加 UniqueConstraint

PS:当然,如果你can/want你可以简单地在DB级别上进行约束,而不需要在Java代码级别上进行任何更改。