2011-11-19 57 views
7

@OneToMany@ManyToManyの違いを理解するのに少し問題があります。 @OneToManyを使用するとデフォルトでJoinTableが作成され、mappedBy属性を追加すると2つのエンティティ間に双方向の関係が設定されます。@OneToManyと@ManyToManyを使用する場合の違い

私は多くのCategoriesに属するかもしれないQuestionを持っていて、1つのCategoryは多くのQuestionsに属するかもしれません。 @ManyToManyまたは@OneToManyを使用すべきかどうか分かりません。なぜなら、私にとってはまったく同じように見えますが、それはおそらくそうではありません。

誰か説明できますか?

答えて

15

違いは、オブジェクトを使用して反映しようとしているデザインの違いです。

あなたのケースでは、はすべてCategoriesに割り当てることができます。つまり、@*ToManyという関係の記号です。今、あなたはどうかを判断する必要があります。

  • がそれぞれCategoryは一つだけQuestionは(それが他のカテゴリーが同じ質問を参照することができないことを意味しユニーク制約になります)、それに割り当てることができ - この意志これは@ManyToMany関係であろう - 各Categoryがそれに割り当てられた複数Questionsを有することができる
  • @OneToMany関係である(Categoryテーブルに一意性制約は存在しません)。

@OneToMany(質問 - >カテゴリ)

この関係は、明示的@JoinTableたりするとき、それは所有側で一方向の関係であるを使用してそう定義した場合にのみ、テーブルを結合で表すことができます'One'側です(つまり、エンティティにはCategoriesのコレクションがありますが、CategoriesにはQuestionへの参照がありません)。

これについて考えると、結合テーブルが使用されているのはかなり妥当と思われます。 DBMSがテーブルの1つの行とCategoriesテーブルの複数の行との間の接続を保存する方法は他にありません。

ただし、双方向関係をモデル化する場合は、Category( 'Many'側)が関係の所有側であることを指定する必要があります。この場合、Categoryテーブルに外部キーを持つ結合列を作成することができます。Categoryの各行は1つだけQuestionと接続できるためです。

このようにして、結合テーブルはなく、単純な外部キーを持ちます(まだ、最初に指されているように、@JoinTableを使用して結合テーブルを作成することができます)。この関係は、結合テーブルとして表現されなければならない

@ManyToMany。基本的には単方向の@OneToManyの関係とよく似ていますが、この場合は、Categoriesから複数の行で結合されたQuestionの複数の行があります。

+0

恐ろしい説明。より多くのupvotesを持っている必要があります。 – LppEdd

0

@ManyToMany関係には、関係の両側に相互に参照する外部キーがあります。時々、この関係は隣接するテーブルによって仲介されます。

@OneToMany関係には、「1」側には外部キーがあり、「多数」側には外部キーがありません。 @OneToMany関係では、1つのオブジェクトが「親」であり、1つが「子」です。親は子の存在を制御する。

@ManyToMany双方向関係は対称である必要はないことに注意してください。

0

あなたの質問&カテゴリの場合、@ManyToMany関係を使用する必要があります。 @ManyToManyは、基本的には「質問は同時に多くのカテゴリに属する​​」と「カテゴリは同時に多くの質問を含むことができる」という意味です。新しいテーブルが自動的に作成され、マッピングが保存されます。あなたのコードは次のようになります。

@Entity 
public class Question implements Serializable { 
    ... 
    @ManyToMany 
    private List<Category> categories; 
    ... 
} 

@Entity 
public class Category implements Serializable { 
    ... 
    @ManyToMany 
    private List<Question> questions; 
    ... 
} 

、あなたの質問とカテゴリの@OneToMany関係を使用している場合、これは質問だけに属することができる」という意味(の一の側と他の質問のカテゴリーを言わせて) 1つのカテゴリ "と" 1つのカテゴリに同時に多くの質問を含める "ことができます。マッピングを格納するために新しいテーブルは必要ありません。代わりに、新しい側のフィールドが、片側のIDを記録するために、多側に自動的に作成されます。あなたのコードは次のようになります:

@Entity 
public class Question implements Serializable { 
    ... 
    @ManyToOne 
    private Category theCategory; 
    ... 
} 

@Entity 
public class Category implements Serializable { 
    ... 
    @OneToMany(mappedBy="theCategory") 
    private List<Question> questions; 
    ... 
} 
関連する問題