@JoinColumn
アノテーションを使用して@OneToMany
リレーションシップジョインテーブルを無効にする可能性があります。デフォルトは結合テーブルです。OneToMany - 結合テーブルと外部キーの違いは何ですか?
たとえば、実動システムのメリットとデメリットは何ですか?
いつ結合テーブルを使用する必要がありますか?
ありがとうございます。
@JoinColumn
アノテーションを使用して@OneToMany
リレーションシップジョインテーブルを無効にする可能性があります。デフォルトは結合テーブルです。OneToMany - 結合テーブルと外部キーの違いは何ですか?
たとえば、実動システムのメリットとデメリットは何ですか?
いつ結合テーブルを使用する必要がありますか?
ありがとうございます。
@OneToMany
は、の一方向の関係を使用する場合にのみ、結合テーブルを作成します。言い換えれば
、あなたがEmployee
とProject
エンティティを持っているとを次のようにEmployee
エンティティが(これらの事業体にはorm.xml
エントリが存在しないと仮定)定義されている場合:
@Entity
public class Employee {
// ...
@OneToMany
Set<Project> projects;
}
@Entity
public class Project {
// ...
}
JPAプロバイダが作成されます。結合テーブル(Project
のEmployee
エンティティへの参照がないので、@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やジョイントテーブルの上に選択肢がないので、選択肢があります。
Hibernateはこれについて明確です: "joinテーブルを持つ単方向の1対多の方がはるかに望ましいです。この関連付けは@JoinTableを通して記述されます。" http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/#d0e1168セクション「2.2.5.3.1.3。結合テーブルによる単方向性」 – lko
多型のために結合テーブルが必要です。たとえば、従業員とマネージャが同じプロジェクトをリンクしており、リレーショナルDBレベルでクラスごとに1つの戦略でマッピングされている場合、そのプロジェクト(ID = 1、emp_id = 10)を知る唯一の方法はマネージャemp_idをmanager_2_employee表に置くことです。このような状況にない場合、emp_idはプロジェクトに直接入ることができます。
結合テーブルの利点を参照http://stackoverflow.com/questions/1307203/hibernate-unidirectional-one-to-many-association-why-a-join-table-better –
上記のコメントで説明したように、デフォルトでは、hibernateはjoinテーブルに行きます。 これにより、db正規化が向上します。
選択した場合、JoinColumnは、SQLクエリの余分なテーブルの結合の必要性が除去されるため、結合テーブルよりも優れたパフォーマンスを提供します。
リレーションテーブルを1:nの関係で使用する必要はありません。もっと正確に質問してください。 –
デフォルトでは、@OneToManyマッピングは結合テーブルを作成します。なぜデフォルトが外部キーとのマッピングではないのかわかりません。 –
JPAは一般に、テーブル内のすべてのフィールドが対応するエンティティ内にマップされていると仮定しているため、パフォーマンスやドローバックには当てはまりません。 ManyToOneを戻してOneToManyを持つ方が一般的なので、これは端的なケースです。 joincolumnを使用する単方向OneToManyでは、子テーブルに外部キーが必要ですが、子エンティティには親への参照がありません。 – Chris