2016-04-27 7 views
0

Hibernate ManyToManyマッピングに関する質問があります。私は2つのクラスAとBを持っており、それらの間のマッピングは、Hibernateによって解決多対多マッピングです:多対多のジャンクションテーブルを別の関係で使用する

@Entity 
@Table(name="A") 
public class A { 

    @Id 
    @GeneratedValue 
    private Long id; 

    @ManyToMany 
    @JoinTable(name="A_B", [email protected](name="A_id"), [email protected](name="B_id")) 
    private Set Bs; 
} 

@Entity 
@Table(name="B") 
public class B { 

    @Id 
    @GeneratedValue 
    private Long id; 

    @ManyToMany(mappedBy="b") 
    private Set As; 
} 

ユーザーとグループへの外部キーは「A_ID」と「B_ID」です。 Join TableはA_Bと呼ばれます。

今、私はCを追加したいと思います。A_BはCとの関係を持っていて、A_B_Cと呼ぶことができるCとA_Bとの多対多の関係を作りたいと思います。

@Entity 
@Table(name="C") 
public class C { 

    @Id 
    @GeneratedValue 
    private Long id; 

    @ManyToMany 
    @JoinTable(name="A_B", [email protected](name="C_id"), [email protected](name="?????")) 
    private Set A_Bs; // Don't have any UserGroup entity ! 
} 

EDIT:だから私はAとBとA_Bのための2 @OneToMany関係で、A_Bエンティティを作成します。

質問:主キーについてのA_Bの最適なソリューションは何ですか?埋め込まれた主キーまたは生成されたID重複したくない(user_id、group_id):/固有の制約だけで十分ですか?

A_B <> Cの関係についてはどうですか?エンティティA_B_Cは必要ありません.ManyToManyで十分でしょう...

私は助けていただきありがとうございます。

ありがとうございます!

+1

Group@ManyToManyの関連付けを必要としますN Group-UserGroup)。あなたは他の関係のために使用されている結合テーブルを退治することはできません –

+0

UserGroup(今はA_B)エンティティを追加すると、Cと@ManyToMany関係を作ることができますが、A_Bでは生成IDまたはEmbeddedIdが必要ですか? – Guillaume

+0

あなたはどんなエンティティでもIDが必要です。これは、User.idとGroup.id(IdClass)またはEmbeddedId(2つのフィールド)から形成されたIdであるか、それらのオブジェクトのためだけに別のIDを必要とするかはあなた次第です。 –

答えて

0

Groupは辞書のようなものなので、にはGroupに関連付ける必要はないと思います。

@Entity 
@Table(name = "users") 
public class User { 

    @Id 
    @GeneratedValue 
    private Long id; 

    @ManyToMany 
    @JoinTable(name = "users_groups") 
    private Set<Group> groups; 

} 

@Entity 
@Table(name="groups") 
public class Group { 

    @Id 
    @GeneratedValue 
    private Long id; 

} 

そして、あなたは、あなたがのUserGroupに関係を持つようにしたい場合は、その後のUserGroupエンティティを作成(および1-NのユーザーのUserGroupを持ち、1- Newsletter

@Entity 
@Table(name="newsletters") 
public class Newsletter { 

    @Id 
    @GeneratedValue 
    private Long id; 

    @ManyToMany 
    @JoinTable(name="newsletters_groups") 
    private Set<Group> groups; 
} 
+0

さて、テーブルA、B、Cを呼んだのは分かっていましたが、私の例は悪いです...しかし、機能的な観点からは、あなたは正しいです。 – Guillaume

関連する問題