2011-12-20 24 views
8

@JoinColumnアノテーションを使用して@OneToManyリレーションシップジョインテーブルを無効にする可能性があります。デフォルトは結合テーブルです。OneToMany - 結合テーブルと外部キーの違いは何ですか?

たとえば、実動システムのメリットとデメリットは何ですか?
いつ結合テーブルを使用する必要がありますか?

ありがとうございます。

+0

リレーションテーブルを1:nの関係で使用する必要はありません。もっと正確に質問してください。 –

+0

デフォルトでは、@OneToManyマッピングは結合テーブルを作成します。なぜデフォルトが外部キーとのマッピングではないのかわかりません。 –

+1

JPAは一般に、テーブル内のすべてのフィールドが対応するエンティティ内にマップされていると仮定しているため、パフォーマンスやドローバックには当てはまりません。 ManyToOneを戻してOneToManyを持つ方が一般的なので、これは端的なケースです。 joincolumnを使用する単方向OneToManyでは、子テーブルに外部キーが必要ですが、子エンティティには親への参照がありません。 – Chris

答えて

16

@OneToManyは、の一方向の関係を使用する場合にのみ、結合テーブルを作成します。言い換えれば

、あなたがEmployeeProjectエンティティを持っているとを次のようにEmployeeエンティティが(これらの事業体にはorm.xmlエントリが存在しないと仮定)定義されている場合:

@Entity 
public class Employee { 
    // ... 

    @OneToMany 
    Set<Project> projects; 
} 

@Entity 
public class Project { 
    // ... 
} 

JPAプロバイダが作成されます。結合テーブルProjectEmployeeエンティティへの参照がないので、@OneToMany注釈にはmappedBy属性はありません)。一方

、あなたは双方向の関係を使用します場合:「多」側は、この関係の外部キーを格納するためにも使用されるように

@Entity 
public class Employee { 
    // ... 

    @OneToMany(mappedBy="employee") 
    Set<Project> projects; 
} 

@Entity 
public class Project { 
    // ... 

    @ManyToOne 
    Employee employee; 
} 

参加の表は、使用されません。

ただし、定義済みのmappedBy属性の双方向@OneToManyの関係がある場合でも、結合テーブルの使用を強制できます。あなたは関係の所有側に@JoinTable注釈を使ってそれを達成することができます。

既述のように結合テーブルを使用する場合(単方向@OneToManyの関係)、前述したように@JoinColumnを使用する可能性もあります。

FKをテストして、テーブルのパフォーマンスの違いを自分でテストすることをお勧めします。私はちょうどより少ない結合(この場合:FK)がより良いパフォーマンスを持つように思われることができます。

また、DBAがデータベーススキーマを定義することがあり、マッピングを既存のスキーマに合わせるだけでよい場合もあります。そうすれば、FKやジョイントテーブルの上に選択肢がないので、選択肢があります。

+0

Hibernateはこれについて明確です: "joinテーブルを持つ単方向の1対多の方がはるかに望ましいです。この関連付けは@JoinTableを通して記述されます。" http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/#d0e1168セクション「2.2.5.3.1.3。結合テーブルによる単方向性」 – lko

0

多型のために結合テーブルが必要です。たとえば、従業員とマネージャが同じプロジェクトをリンクしており、リレーショナルDBレベルでクラスごとに1つの戦略でマッピングされている場合、そのプロジェクト(ID = 1、emp_id = 10)を知る唯一の方法はマネージャemp_idをmanager_2_employee表に置くことです。このような状況にない場合、emp_idはプロジェクトに直接入ることができます。

+0

結合テーブルの利点を参照http://stackoverflow.com/questions/1307203/hibernate-unidirectional-one-to-many-association-why-a-join-table-better –

0

上記のコメントで説明したように、デフォルトでは、hibernateはjoinテーブルに行きます。 これにより、db正規化が向上します。

選択した場合、JoinColumnは、SQLクエリの余分なテーブルの結合の必要性が除去されるため、結合テーブルよりも優れたパフォーマンスを提供します。

関連する問題