Учитывая следующий пример (отделы - проекты):Ограничение JPA 1.0 с использованием @IdClass с * вложенными * составными первичными ключами?
Отдел имеет следующие свойства (составной первичный ключ):
@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;
...
}
Здесь класс PK:
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;
...
}
ProjectID является:
public class ProjectId implements Serializable
{
private String name;
private DeptId dept;
...
}
проблема с этим состоит в том, что ни Hibernate, ни EclipseLink узнать, как отобразить два избыточных свойств столбца DEPTNUM и deptCtry в проекте на имущество DEPT в DeptId (или внутри него Недвижимость Болгария Недвижимость). -> MappingException и т.д.
Мой вопрос:
Является ли это ограничение JPA 1.0, что таблицы с составными ключами, ссылающихся другие ключи композитных с реализациями @IdClass вообще не будет работать, поскольку осуществление JPA просто не можете знать, как сопоставить эти поля?
В качестве обходного пути вам необходимо использовать @EmbeddedId для этих классов или использовать синтаксис JPA 2.0 для аннотации ассоциаций @XToX с помощью @Id. Я просто хочу убедиться, что мой взгляд на это прав.
Благодаря
Речь идет не о вставном/обновляемом материале. Как ORM узнают, какие свойства карты dept_x ProjectId? Я не работаю с обоими ... Hibernate AND EL. Они уже терпят неудачу, когда EntityManagerFactory создается. Это имеет смысл ... – Kawu
@Kawu: Может быть, я не понимаю, что вы говорите, но когда вы повторяете сопоставления, как показано выше, вы должны сделать связь только для чтения, используя insertable/updatable в 'JoinColumn'. Если это не сработает, покажите сопоставление, позволяющее воспроизвести и некоторые следы, иллюстрирующие проблему. –
Позвольте мне пояснить это: JPA 1.0 не позволяет @Id об ассоциациях, поэтому в Project у вас есть два избыточных члена deptNumber и deptCountry. Поскольку эти два являются PK в таблице Departments, составной ключевой класс Project ProjectId имеет член типа DeptId. Но Hibernate и EclipseLink оба бросают отображение исключений, потому что они не могут сопоставить два избыточных элемента @Id members deptNumber и deptCountry с свойствами DeptId. Я хотел знать, является ли это общим ограничением, или если есть способ сообщить ORM JPA 1.0 как их сопоставить. (JPA 1.0 требует, чтобы имена полей совпадали) – Kawu