2015-05-17 17 views
7

@JoinColumn dà un Entity una chiave esterna a un'altra Entity mentre @JoinTable elencherà il rapporto tra tutti i rapporti tra Entity A e B. Entity Per quanto posso dire, entrambi sembrano fare cose simili. Quando dovrei usare l'uno o l'altro?Quando dovrei usare @JoinColumn o @JoinTable?

risposta

12

Diciamo che avete un soggetto A, che ha un'associazione @ManyToOne ot un'entità B

@JoinColumn definirà la tabella di destinazione chiave esterna (per esempio B_ID) mentre si utilizza la tabella di destinazione Entità (ad esempio B).

@Entity 
public class A { 

    private Long id; 

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

} 

@JoinTable userà una tabella separata per contenere il rapporto tra A e 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; 

} 

Questa volta né AB contiene alcuna chiave esterna, perché c'è una tabella separata (ad esempio A_B) per tenere l'associazione tra A e B.

+0

quindi un JoinTable è una relazione N-N? – julestruong

+0

Nella terminologia del database, è un'associazione many-to-many. In questo caso, un FK avrà un vincolo univoco per trasformarlo in un'associazione uno-a-molti con una tabella di join. –

3

@JoinTable memorizza l'id di entrambe le tabelle in una tabella separata mentre @JoinColumn memorizza l'id di un'altra tabella in una nuova colonna.

@JoinTable: questo è il tipo predefinito. Usalo quando hai bisogno di un database più normalizzato. vale a dire. ridurre la ridondanza.

@JoinColumn: utilizzare questo per prestazioni migliori in quanto non è necessario unirsi alla tabella aggiuntiva.

Problemi correlati