Приведен следующий пример (отделы - проекты):
Отдел имеет следующие свойства (составной первичный ключ):
@Entity
@IdClass(DeptId.class)
public class Department
{
@Id
@Column(name="number")
private Integer number;
@Id
@Column(name="country")
private String country;
@Column(name="name")
private String name;
@OneToMany(mappedBy="dept")
private Collection<Project> projects;
...
}
Здесь класс ПК:
public class DeptId implements Serializable
{
private Integer number;
private String country;
...
}
Отношения между проектами и отделами много-к-одному, то есть отдел может иметь много проектов. Класс Project сам использует составной ключ, ссылаясь на составной ключ Департамента. Важное примечание: речь идет только о реализации с @IdClass, а не @ EmbeddedId.
Тогда (проблемная) реализация JPA 1.0 @IdClass должна выглядеть примерно так (избыточные свойства deptNum и deptCtry): -> это просто уникальное имя в отделе
@Entity
@IdClass(ProjectId.class)
public class Project
{
@Id
@Column(name="dept_number")
private Integer deptNumber;
@Id
@Column(name="dept_country")
private String deptCountry;
@Id
@Column(name="name")
private String name;
@ManyToOne
@JoinColumns({
@JoinColumn(name="dept_number", referencedColumnName="number"),
@JoinColumn(name="dept_country", referencedColumnName="country")
})
private Department dept;
...
}
Идентификатор проекта:
public class ProjectId implements Serializable
{
private String name;
private DeptId dept;
...
}
Проблема в том, что ни Hibernate, ни EclipseLink не знают, как сопоставить два избыточных свойства deptNum и deptCtry в Project со свойством dept в DeptId (или соответствующими им свойствами). -> MappingException и т. Д.
Мой вопрос:
Является ли это ограничением JPA 1.0, что таблицы с составными ключами, ссылающимися на другие составные ключи с реализациями @IdClass , как правило, НЕ будут работать , потому что реализация JPA просто не может знать, как отобразить эти поля
В качестве обходного пути вам придется использовать @EmbeddedId для этих классов или использовать синтаксис JPA 2.0 для аннотирования ассоциаций @XToX с @Id. Я просто хочу убедиться, что мой взгляд на это правильный.
Спасибо