2

@ManyToManyHibernate で3 方向の関係をマッピングする最良の方法を見つけようとしています。以下は私のデータモデルです:

ここに画像の説明を入力

ご覧のとおり、TeamPosition テーブルは 3 つの外部キーにすぎません。Hibernate は、2 つのテーブル間の ManyToMany マッピングと、3 つ目の Hibernate エンティティを作成する必要がない場合にそれらを結合するマッピング テーブルの形式で、便利な機能を提供します。もちろん、そのマッピング テーブルに「StartDate」、「EndDate」などの追加データがある場合は、とにかくマッピング テーブル用にエンティティを作成する必要があります。

他の 2 つのエンティティの各エンティティに 2 つの ManyToMany マッピングを作成することは可能ですか?それとも、代わりに TeamPosition エンティティを作成し、これに OneToMany 関係を持たせれば、より単純で痛みが少なくなりますか?

必ずしも間違った答えがあるとは思いませんが、いくつかの答えは他の答えよりも正しいかもしれません.

4

1 に答える 1

1

面白い問題!

明確にするために: このデータベースの一部は、特定のチームが特定のシーズンに所属していたリーグ グループを記録していますか? ここでの「リーグ・グループ」とはどういう意味ですか? プレミアリーグvsチャンピオンシップvsリーグ1のように?特定のシーズンに特定のリーグ グループに複数のチームが存在することはありますか?

エンティティを作成TeamPositionすることは、最も苦痛の少ないことだと思います。リレーションシップはすべて 1 対多であり、その外部キーを使用して複合主キーを構築できますTeamSeasonこれにより、テーブルに冗長な代理キーを与える必要がなくなります。テーブルを介して結合するクエリは、明示的に名前を付ける必要がありますが、かなり簡単です。

ただし、これをマップとしてモデル化することもできます。次のようなもの:

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の力を超えていると思います(ただし、私は間違っている可能性があります)。

于 2012-07-24T21:32:39.260 に答える