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