1

我有五个 MySQL 表

  • employee
  • qualification
  • institute qualification_institute(id,qualification_id,institution_id)
  • employee_qualification_institute(employee_id,qualification_institute_id)

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

该类Qualification已经包含一个Set<Institute>字段,而该类Institute包含一个Set<Qualification>. 如果我可以在里面注释一个地图Employee,也许我可以避免必须有一个显式的EmployeeQualificationInstitute类。

4

1 回答 1

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;
}
于 2012-06-06T17:12:01.817 回答