鉴于下面的例子(部门 - 项目):使用具有*嵌套*复合主键的@IdClass限制JPA 1.0?
甲系具有下列特性(复合主键):
@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;
...
}
的专案编号是内>这只是一个唯一的名称:
public class ProjectId implements Serializable
{
private String name;
private DeptId dept;
...
}
这样做的问题是,无论是休眠还是EclipseLink的知道如何将两个冗余特性deptNum和deptCtry在项目映射到DEPTID的部门属性(或其中的性的判定)。 - > MappingException等
我的问题是:
这是JPA 1.0的限制,与复合键的表引用其它组合键使用@IdClass实现一般不会工作,因为JPA实现根本无法知道如何映射这些字段?
作为一种解决方法,您必须对这些类使用@EmbeddedId,或者使用JPA 2.0语法来使用@Id注释@XToX关联。我只是想确保我对此的看法是正确的。
感谢
这不关于可插入/可更新的东西。 ORM如何知道ProjectId的dept_x映射的属性?我没有与两个工作...休眠和EL。当EntityManagerFactory被实例化时,它们已经失败。这是有道理的... – Kawu 2010-10-31 12:02:15
@Kawu:也许我没有听到你说的话,但当你重复上面的映射时,你必须使用JoinColumn中的可插入/可更新来使关联成为只读。如果它不起作用,则显示允许重现的映射和一些说明问题的痕迹。 – 2010-10-31 13:24:03
让我澄清一下:JPA 1.0不允许在关联上使用@Id,这就是为什么在Project中有两个冗余成员deptNumber和deptCountry。由于这两个是Departments表中的PK,因此项目的组合键类ProjectId具有DeptId类型的成员。但Hibernate和EclipseLink都会抛出映射异常,因为它们不能将两个冗余的@Id成员deptNumber和deptCountry映射到DeptId的属性。我想知道这是一个普遍的限制,还是有办法告诉JPA 1.0 ORM如何映射它们。 (JPA 1.0要求字段的名称匹配) – Kawu 2010-11-01 11:03:06