András Hummer
András Hummer

Reputation: 972

Map a join table to a Map object in Java with JPA

I have five MySQL tables

qualification_institute defines a ManyToMany connection between obtainable qualifications and institutes while employee_qualification_institute tells us which institute a particular employee got his/her qualification at. EclipseLink generates a Set<QualificationInstitute> field in the Employee class, however I'd like a Map<Qualification, Institute> instead of it. How should I annotate that map? As I have property based access, will I need to implement a query in its getter method?

The Qualification class already contains a Set<Institute> field while the class Institute holds a Set<Qualification>. If I could annotate a map inside Employee, perhaps I could avoid having to have an explicit EmployeeQualificationInstitute class.

Upvotes: 2

Views: 3534

Answers (1)

siebz0r
siebz0r

Reputation: 20339

In this case you can't. Since by design a qualification isn't unique per institute. And I quote from Map's JavaDoc:

An object that maps keys to values. A map cannot contain duplicate keys; each key can map to at most one value.

The EmployeeQualificationInstitute class however is not necessary.

Example:

@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;
}

Upvotes: 1

Related Questions