Quand dois-je utiliser @JoinColumn ou @JoinTable avec JPA?

@JoinColumn donne Entity une clé étrangère vers une autre Entity alors que @JoinTable liste de la relation entre toutes les relations entre Entity et Entity B. pour autant que je puisse dire, ils semblent tous les deux faire des choses semblables. Quand devrais-je utiliser l'un ou l'autre?

11
demandé sur Vlad Mihalcea 2015-05-17 18:20:50

2 réponses

disons que vous avez une entité A qui a un @ManyToOne association d'une entite B

@JoinColumn définira la table cible clé étrangère(E. g B_ID) en utilisant la table entité cible (par exemple B).

@Entity
public class A {

    private Long id;

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

}

@JoinTable utilisera une table séparée pour maintenir la relation entre A et B.

@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;

}

cette fois ni l'un ni l'autre A ni B contiennent une clé étrangère, parce qu'il y a une table séparée (par exemple A_B) pour maintenir l'association entre A et B.

21
répondu Vlad Mihalcea 2017-11-14 05:36:56

@JoinTable stocke l'id des deux tables dans une table séparée tandis que @JoinColumn stocke l'id d'une autre table dans une nouvelle colonne.

@JoinTable: c'est le type par défaut. Utilisez ceci lorsque vous avez besoin d'une base de données plus normalisée. IE. pour réduire la redondance.

@JoinColumn : utilisez ceci pour de meilleures performances car il n'a pas besoin de rejoindre une table supplémentaire.

9
répondu Rabin Pantha 2017-05-01 05:39:45