给定以下示例(部门 - 项目):
部门具有以下属性(复合主键):
@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 类本身使用引用 Department 的复合键的复合键。重要提示:这只是关于@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;
...
}
项目 ID 是:
public class ProjectId implements Serializable
{
private String name;
private DeptId dept;
...
}
问题在于 Hibernate 和 EclipseLink 都不知道如何将 Project 中的两个冗余属性 deptNum 和 deptCtry 映射到 DeptId 中的 dept 属性(或其中的属性)。-> MappingException 等。
我的问题是:
这是 JPA 1.0 的限制吗,具有组合键的表引用具有 @IdClass 实现的其他组合键通常不起作用,因为 JPA 实现根本不知道如何映射这些字段?
作为一种解决方法,您必须对这些类使用@EmbeddedId 或使用JPA 2.0 语法来用@Id 注释@XToX 关联。我只是想确保我对此的看法是正确的。
谢谢