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 的一部分Phone
class。除此之外,这也不是您的主键:主键是 id 属性 (如您所拥有的)。您实际需要的是为这两列指定一个唯一键。为此,一种解决方案是放弃 Employee class 中的 Map
并移动 Phone
class 中的 phoneType
,其中然后您可以添加 UniqueConstraint
。
PS:当然,如果你can/want你可以简单地在DB级别上进行约束,而不需要在Java代码级别上进行任何更改。
在地图 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 的一部分Phone
class。除此之外,这也不是您的主键:主键是 id 属性 (如您所拥有的)。您实际需要的是为这两列指定一个唯一键。为此,一种解决方案是放弃 Employee class 中的 Map
并移动 Phone
class 中的 phoneType
,其中然后您可以添加 UniqueConstraint
。
PS:当然,如果你can/want你可以简单地在DB级别上进行约束,而不需要在Java代码级别上进行任何更改。