私は自分の質問をして答えていますが、私が最良の答えを持っているとは思いません。より良いものがあれば、投稿してください!
関連する質問:
- JPAで@EmbeddedIdからの後方参照を設定する方法
- Embeddedid(?)のHibernateマッピング
- @EmbeddedIdを使用したJPA複合キー
単純な集約関係にあるクラスのペアがあります。一方のインスタンスは、もう一方のインスタンスをいくつか所有しています。所有するクラスには、それ自体のある種の主キーがあり、所有するクラスには、対応する外部キーを介してこのクラスに対して多対1があります。所有するクラスに、その外部キーといくつかの追加情報で構成される主キーを持たせたいです。
議論のために、それらの長年のお気に入りであるOrderとOrderLineを使用しましょう。
SQLは次のようになります。
-- 'order' may have been a poor choice of name, given that it's an SQL keyword!
create table Order_ (
orderId integer primary key
);
create table OrderLine (
orderId integer not null references Order_,
lineNo integer not null,
primary key (orderId, lineNo)
);
これをJPAを使用してJavaにマッピングしたいと思います。順序は簡単で、OrderLineは@IdClassで処理できます。これがそのためのコードです-コードはかなり慣習的です、そしてあなたが私の特異性を許してくれることを願っています。
ただし、@ IdClassを使用するには、OrderLineのフィールドを複製するIDクラスを作成する必要があります。その重複を避けたいので、代わりに@EmbeddedIdを使用したいと思います。
ただし、これを行うための素朴な試みは失敗します。
@Embeddable
public class OrderLineKey {
@ManyToOne
private Order order;
private int lineNo;
}
OpenJPAは、@EmbeddedIdとしての使用を拒否します。私は他のプロバイダーを試したことがありませんが、JPA仕様では、IDクラスを構成するフィールドが関係ではなく基本である必要があるため、それらが成功することは期待できません。
それで、なにかお手伝いできますか?キーに@ManyToOne関係が含まれているが、@ EmbeddedIdとして処理されるクラスを作成するにはどうすればよいですか?