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
の明示的な使用に注意してください。