次の例を考えます (部門 - プロジェクト):
部門には次のプロパティがあります (複合主キー)。
@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;
...
}
プロジェクトと部門の間の関係は多対 1 です。つまり、部門は多くのプロジェクトを持つことができます。Project クラス自体は、Department の複合キーを参照する複合キーを使用しています。重要な注意: @EmbeddedId ではなく @IdClass を使用した実装のみです。
次に、(問題のある) 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;
...
}
ProjectId は次のとおりです。
public class ProjectId implements Serializable
{
private String name;
private DeptId dept;
...
}
これに関する問題は、Hibernate も EclipseLink も、Project の 2 つの冗長なプロパティ deptNum と deptCtry を DeptId の dept プロパティ (またはその中のプロパティ) にマップする方法を認識していないことです。-> MappingException など
私の質問は:
これは JPA 1.0 の制限であり、@IdClass 実装を持つ他の複合キーを参照する複合キーを持つテーブルは一般に機能しません。JPA 実装はこれらのフィールドをマップする方法を単に知らないためですか?
回避策として、これらのクラスに @EmbeddedId を使用するか、JPA 2.0 構文を使用して @XToX 関連付けに @Id のアノテーションを付ける必要があります。これに関する私の見解が正しいことを確認したいだけです。
ありがとう