2015-02-23 87 views
0

以下内容的relation mapping example为地图,我有地图键列关系注释的JPA:使用复合主键在地图关系

EMPLOYEE

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是复合主键?

回答

1

由于PHONE_TYPE是Employee类中Map的一部分,OWNER_id是Phone类的一部分,因此无法为复合主键发信号。除此之外,这也不是你的主键:主键是id属性(就像你拥有它)。你实际需要的是在这两列上指定一个唯一的键。为此,一种解决方案是放弃Employee类中的Map,并将phoneType移动到Phone类中,然后在那里添加UniqueConstraint。 PS:当然,如果你愿意,你可以简单地对DB级别进行约束,而不需要对Java代码进行任何改变。

+0

好的,谢谢。但是,当我移动phone_type时,我如何从员工那里获得电话的参考信息,即如何获取所有参考实体? – 2015-02-23 15:29:14

+0

作为'列表'。它的一个小缺点是,你无法从该列表中快速检索出它的类型,但最大的好处是你在映射时可以获得更多的灵活性,并且可能还有搜索本身。 – 2015-02-23 15:31:27