鑑於下面的例子(部門 - 項目):使用具有*嵌套*複合主鍵的@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