この質問は、ここでよく尋ねられ、回答されています:
JPA で @EmbeddedId として @ManyToOne 属性を含む複合主キーを作成する方法は?
次の 4 つのクラスが必要です。
- Person.java
- ホーム.java
- PersonHome.java
- PersonHomePk.java
PersonHome.java との 1 対多の関係で作成する Person.java および Home.java ファイル。主キーを識別するための @Id フィールドがあります。それぞれに @OneToMany 関係が定義され、少なくとも、PersonHome エンティティのそれぞれのフィールドにマップされた mappingBy 属性が定義されます。つまり、 Person.java では、次のようなものを持つことができます
@OneToMany(cascade = CascadeType.ALL, mappedBy = "Person")
private Collection<PersonHome> personHome;
PersonHome.java には、その主キーである PersonHomePk インスタンス宣言を識別する @EmbeddedId フィールドがあります (つまり、@Id 列の代わりに、結合の主キーを表すクラスの宣言に注釈を付ける @EmbeddedId があります)。表 PersonHome )。その他のフィールドは、通常の列として宣言されます。PersonHome.java は、person と home に対してそれぞれ 1 つずつ、2 つの ManyToOne リレーションも宣言します。これらは @JoinColumn アノテーションを使用します (属性 insertable=false および updatetable=false があることを確認してください)。データ型は Person クラスと Home クラスになります。すなわち
@EmbeddedId
protected PersonHomePk personHomePk;
@Column (name = "type")
private String type;
@JoinColumn(name = "person_id", referencedColumnName = "person_id", insertable = false, updatable = false)
@ManyToOne(optional = false)
private Person person;
「ホーム」宣言にも同じことが必要です。
「タイプ」に char のみを使用するのはなぜですか。varchar をお勧めします。これにより、あなたがいなくなったときに保守する人が、あなたがいなくてもコードとデータベースをよりよく理解できるようになります。「detached」は「d」の方が理解しやすいです。