3.2.6. 複合プライマリおよび外部キーのマッピング
複合プライマリキーは組み込みクラスをプライマリキー表現として使用します。したがって、
@Id アノテーションと @Embeddable アノテーションを使用します。または、@EmbeddedId アノテーションを使用できます。依存クラスはシリアル化できる必要があり、equals()/hashCode() を実装することに注意してください。また、「ID プロパティのマッピング」 で説明されたように @IdClass を使用することもできます。
@Entity
public class RegionalArticle implements Serializable {
@Id
public RegionalArticlePk getPk() { ... }
}
@Embeddable
public class RegionalArticlePk implements Serializable { ... }
または
@Entity public class RegionalArticle implements Serializable {
@EmbeddedId
public RegionalArticlePk getPk() { ... }
}
public class RegionalArticlePk implements Serializable { ... }
Hibernate 固有のアノテーション
@AccessType が使用されない限り、@Embeddable は所有側エンティティのアクセスタイプを継承します。複合外部キー (デフォルトのセンシティブな値を使用しない場合) は、基本的に @JoinColumn のアレイである @JoinColumns エレメントを使用して関係に対して定義されます。referencedColumnNames を明示的に表現することは推奨される方法です。この方法に従わないと、Hibernate はユーザーがプライマリキー宣言と同じ順序のカラムを使用すると見なします。
@Entity
public class Parent implements Serializable {
@Id
public ParentPk id;
public int age;
@OneToMany(cascade=CascadeType.ALL)
@JoinColumns ({
@JoinColumn(name="parentCivility", referencedColumnName = "isMale"),
@JoinColumn(name="parentLastName", referencedColumnName = "lastName"),
@JoinColumn(name="parentFirstName", referencedColumnName = "firstName")
})
public Set<Child> children; //unidirectional
...
}
@Entity
public class Child implements Serializable {
@Id @GeneratedValue
public Integer id;
@ManyToOne
@JoinColumns ({
@JoinColumn(name="parentCivility", referencedColumnName = "isMale"),
@JoinColumn(name="parentLastName", referencedColumnName = "lastName"),
@JoinColumn(name="parentFirstName", referencedColumnName = "firstName")
})
public Parent parent; //unidirectional
}
@Embeddable
public class ParentPk implements Serializable {
String firstName;
String lastName;
...
}
referencedColumnName の明示的な使用に注意してください。