Reputation: 972
I have five MySQL tables
employee
qualification
institute qualification_institute
(id, qualification_id,
institute_id)employee_qualification_institute
(employee_id, qualification_institute_id)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
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