Вопрос по java – Отображение внешнего ключа внутри класса Embeddable

12

я используюeclipselink заJPA, У меня есть сущность, которая имеетcomposite key изготовлены из двух полей. Следующее моеEmbeddable класс первичного ключа & apos; полей (членов).

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

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

<code>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.
</code>

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

Ваш Ответ

1   ответ
14

@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;

    ...
}

НТН

Похожие вопросы