web-dev-qa-db-ja.com

JPAで@JoinColumnまたは@JoinTableを使用する場合

@JoinColumnEntityに別のEntityへの外部キーを与えますが、@JoinTableは、Entity AとEntity Bの間のすべての関係の間の関係をリストします。私が知る限り、どちらも同じようなことをしているように見えます。どちらを使用すればよいですか?

19
Sarah Szabo

Aというエンティティがあり、@ManyToOneエンティティとの関連付けB

@ JoinColumn は、ターゲットテーブルの外部キーを定義します(例:B_ID)ターゲットエンティティテーブルを使用しているとき(例:B)。

@Entity
public class A {

    private Long id;

    @ManyToOne
    @JoinColumn(name="B_ID")
    private B b;

}

@ JoinTable は、別のテーブルを使用して、ABの関係を保持します。

@Entity
public class A {

    private Long id;

    @ManyToOne
    @JoinTable(
       name = "A_B", 
       joinColumns = @JoinColumn(name = "B_ID"), 
       inverseJoinColumns = @JoinColumn(name = "A_ID")
    )
    private B b;

}

今回はABも外部キーを含んでいません。これは、別個のテーブルがあるためです(例:A_BABの間の関連付けを保持します。

31
Vlad Mihalcea

@JoinTableは両方のテーブルのIDを別のテーブルに格納し、@ JoinColumnは別のテーブルのIDを新しい列に格納します。

@JoinTable:これはデフォルトのタイプです。より正規化されたデータベースが必要な場合に使用します。すなわち。冗長性を減らすため。

@JoinColumn:追加のテーブルを結合する必要がないため、これを使用してパフォーマンスを向上させます。

12
Rabin Pantha