我正在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
}
我的实体将保留与员工相关的休假数据,因此我尝试将员工对象和离开日期结合起来以生成组合键。除了我的逻辑,它不允许我在embeddable类中有一个外键映射。当我尝试使用 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?请帮忙。感谢
答案 0 :(得分:14)
不要将关系放入ID类,也不要放入@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;
...
}
HTH