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>