2.2.6. Mapping composite primary and foreign keys 複合主キーと外部キーのマッピング
<2.2.5.5. Association fetching | 目次 | 2.2.7. Mapping secondary tables>
複合主キーは埋め込みクラスを主キーとして使うよ。だから、@Id と @Embeddable アノテーションが使えるよ。また、@EmbeddedId アノテーションでもいいよ。依存するクラスは Serializable で、equals() と hashCode() を実装してないといけないよ。また、2.2.3. Mapping identifier propertiesで言ったように、@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 { ... }
@Embeddable は、Hibernate仕様のアノテーション @AccessType が使われないと、親エンティティのアクセスタイプを継承するよ。複合外部キー(デフォルト値を使わない場合)は、@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 を明示するように気をつけてね。<2.2.5.5. Association fetching | 目次 | 2.2.7. Mapping secondary tables>