Сопоставьте таблицу соединений с объектом Map в Java с помощью JPA - PullRequest
1 голос
/ 11 марта 2012

У меня есть пять таблиц MySQL

  • 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 генерирует поле Set<QualificationInstitute> в классе Employee, однако я бы хотел вместо него Map<Qualification, Institute>.Как мне аннотировать эту карту?Поскольку у меня есть доступ на основе свойств, мне нужно будет реализовать запрос в его методе получения?

Класс Qualification уже содержит поле Set<Institute>, в то время как класс Institute содержит Set<Qualification>.Если бы я мог аннотировать карту внутри Employee, возможно, я бы избежал необходимости иметь явный класс EmployeeQualificationInstitute.

1 Ответ

1 голос
/ 06 июня 2012

В этом случае вы не можете. Поскольку по определению квалификация не уникальна для каждого института. И я цитирую из 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;
}
...