面白い問題!
明確にするために: このデータベースの一部は、特定のチームが特定のシーズンに所属していたリーグ グループを記録していますか? ここでの「リーグ・グループ」とはどういう意味ですか? プレミアリーグvsチャンピオンシップvsリーグ1のように?特定のシーズンに特定のリーグ グループに複数のチームが存在することはありますか?
エンティティを作成TeamPosition
することは、最も苦痛の少ないことだと思います。リレーションシップはすべて 1 対多であり、その外部キーを使用して複合主キーを構築できますTeam
。Season
これにより、テーブルに冗長な代理キーを与える必要がなくなります。テーブルを介して結合するクエリは、明示的に名前を付ける必要がありますが、かなり簡単です。
ただし、これをマップとしてモデル化することもできます。次のようなもの:
public class Team {
@ManyToMany
private Map<Season, LeagueGroup> positions;
}
安全性は保証されません。私はこれを一度だけ行ったことがあります。上記から SQL を生成すると (私の場合は Hibernate のスキーマ ジェネレーターを使用)、次の結合テーブルが得られます (エンティティに整数キーを指定しました)。
create table Team_LeagueGroup (
Team_id integer not null,
positions_id integer not null,
positions_KEY integer not null,
primary key (Team_id, positions_KEY)
);
次の外部キーを使用すると、これが少し明確になります。
alter table Team_LeagueGroup
add constraint FKE143A2AEB84635C9
foreign key (Team_id)
references Team;
alter table Team_LeagueGroup
add constraint FKE143A2AEB7412E91
foreign key (positions_id)
references LeagueGroup;
alter table Team_LeagueGroup
add constraint FKE143A2AE8F6AD5C
foreign key (positions_KEY)
references Season;
これはほぼ正しいように見えます。通常の注釈を使用して、必要に応じてテーブルと列の名前をカスタマイズできます。
これにより、結合テーブルのエンティティを作成する必要がなくなりましたが、必要なことがいくつか残っています。まず、これに参加するためのJPQL構文が何であるかわかりません。それはドキュメントに記載されますが、それを見つけるために仕様のあいまいなコーナーを探索することで、スカウト バッジを確実に取得できます。第二に、これに逆マッピングを設定する方法はないと思います。問題は、チームとシーズンの組み合わせによってリーグ グループが一意に識別されますが、これら 3 つの他のペアには当てはまらないことです。特定のチームは、複数のシーズンにわたって特定のリーグ グループに属する場合があり、特定のシーズンの特定のリーグ グループには複数のチームが含まれます。逆の関係は次のようにする必要がありますclass LeagueGroup { Map<Season, Set<Team>> teams; }
、そしてそれはJPAの力を超えていると思います(ただし、私は間違っている可能性があります)。