2012-04-09 3 views
11

Я использую eclipselink для JPA. У меня есть сущность, которая имеет составной ключ , изготовленный из двух полей. Ниже приведен список моих Вкладок полей первичного ключа (участников).Отображение внешнего ключа внутри Класс встроенного ввода

@Embeddable 
    public class LeavePK { 
     @ManyToOne(optional = false) 
     @JoinColumn(name = "staffId", nullable = false) 
     private Staff staff; 
     @Temporal(TemporalType.TIMESTAMP) 
     private Calendar date; 
     //setters and getters 
    } 

Моя организация собирается провести оставить данные, связанные с персоналом, так что я пытаюсь объединить объект персонала и дату оставить для получения составного ключа. Помимо моей логики, это не позволяет мне отображать внешний ключ внутри внедряемого класса. Когда я пытаюсь использовать Инструменты JPA -> Сгенерировать таблицы из объекта, он дает ошибку, как показано ниже, что объясняет, но я не получаю его.

org.eclipse.persistence.exceptions.ValidationException 
Exception Description: The mapping [staff] from the embedded ID class [class rs.stapp.entity.LeavePK] is an invalid mapping for this class. An embeddable class that is used with an embedded ID specification (attribute [leavePK] from the source [class rs.stapp.entity.Leave]) can only contain basic mappings. Either remove the non basic mapping or change the embedded ID specification on the source to be embedded. 

Означает ли это, что я не могу иметь ключ (из составного ключа), который также является внешним ключом. Есть ли альтернативный способ выполнения этой ERM? Пожалуйста помоги. Спасибо

ответ

12

Не устанавливайте отношения в классы идентификаторов, ни для @IdClass, ни для @EmbeddedId. Класс @Embeddable может включать только аннотации @Basic, @Column, @Temporal, @Enumerated, @Lob, или @Embedded. Все остальное - синтаксис, зависящий от провайдера (например, Hibernate разрешает это, но поскольку вы используете EclipseLink, который является JPA RI, я сомневаюсь, что это то, что вы хотите).

Вот пример JPA PK/FK отображение:

@Entity 
@Table(name = "Zips") 
public class Zip implements Serializable 
{ 
    @EmbeddedId 
    private ZipId embeddedId; 

    @ManyToOne 
    @JoinColumn(name = "country_code", referencedColumnName = "iso_code") 
    private Country country = null; 

    ... 
} 

@Embeddable 
public class ZipId implements Serializable 
{ 
    @Column(name = "country_code") 
    private String countryCode; 

    @Column(name = "code") 
    private String code; 

    ... 
} 

НТН

Смежные вопросы