Отображение внешнего ключа внутри класса Embeddable
Я использую eclipselink
для JPA
. У меня есть сущность, которая имеет составной ключ, изготовленный из двух полей. Ниже перечислены поля (члены) основного класса Embeddable.
@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 → Generate Tables From Entity, он дает ошибку, как показано ниже, что объясняет, но я не получаю ее.
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? Пожалуйста помоги. Благодаря
Ответы
Ответ 1
Не устанавливайте отношения в классы идентификаторов, а не для @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;
...
}
НТН