2012-03-11 44 views
1

我有五个MySQL表地图连接表的Map对象在Java中使用JPA

  • employee
  • qualification
  • institute qualification_institute(ID,qualification_id, institute_id)
  • employee_qualification_institute(EMPLOYEE_ID, qualification_institute_id)

qualification_institute定义了可获得的资格和机构之间的ManyToMany连接,而employee_qualification_institute告诉我们哪个机构的特定员工获得了其资格。 EclipseLink在Employee类中生成一个Set<QualificationInstitute>字段,但是我想要一个Map<Qualification, Institute>而不是它。我应该如何注释该地图?由于我有基于属性的访问,我需要在其getter方法中实现一个查询吗?

Qualification类已包含Set<Institute>字段,而Institute类包含Set<Qualification>。如果我可以在Employee内注释一张地图,也许我可以避免必须有一个明确的EmployeeQualificationInstitute类。

+0

只是为了了解...什么是一个ManyToManyToMany关系的原因是什么?员工E是否有可能获得I1研究所的资格Q1,I1研究所的资格Q2,I2研究所的资格Q1以及I2研究所的资格Q2?如果是,那么确定,否则这是一个糟糕的分贝设计。 – perissf 2012-03-11 12:19:54

+0

是的。多个学院可以获得一定的资格,而每个学院都有多种资格。我在Employee类中需要的地图是显示哪个资格是从哪个机构获得的。 – 2012-03-12 08:04:19

回答

1

在这种情况下,你不能。由于通过设计,每个研究所的资格并非唯一。我引用了Map的JavaDoc:

将键映射到值的对象。地图不能包含重复的键;每个键可以映射到最多一个值。

然而EmployeeQualificationInstitute类没有必要。

例子:

@Entity 
public class Employee 
{ 
    @Id 
    @GeneratedValue 
    private Long id; 
    @JoinTable(name="EmployeeQualificationInstitute", 
     joinColumns={ 
      @JoinColumn(name = "id", referencedColumnName = "employee_id") 
     } 
    ) 
    private Set<QualificationInstitute> 
} 

@Entity 
public class Qualification 
{ 
    @Id 
    @GeneratedValue 
    private Long id; 
} 

@Entity 
public class Institute 
{ 
    @Id 
    @GeneratedValue 
    private Long id; 
} 

@Entity 
public class QualificationInstitute 
{ 
    @EmbeddedId 
    private QualificationInstitutePK key; 

    @MapsId(value = "qualification_id") 
    @ManyToOne 
    @JoinColumn(name = "qualification_id", referencedColumnName = "id") 
    private Qualification qualification; 

    @MapsId(value = "institute_id") 
    @ManyToOne 
    @JoinColumn(name = "institute_id", referencedColumnName = "id") 
    private Institute institute; 
} 

@Embeddable 
public class QualificationInstitutePK 
{ 
    @Column(name = "qualification_id") 
    private Long qualification_id; 

    @Column(name = "institute_id") 
    private Long institute_id; 
}