2009-08-20 14 views
30

In questo documento (scorrere verso il basso fino alla sezione unidirezionale):Hibernate unidirezionale associazione uno a molti: perché un tavolo join è migliore?

http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#entity-mapping-association-collections

si dice che un'associazione unidirezionale uno-a-molti con una tabella di join è di gran lunga preferito a solo utilizzando una colonna chiave esterna nella entità di proprietà. La mia domanda è, perché è molto preferito?

+0

vedere http://stackoverflow.com/questions/2092611/why-is-it-recommended-to-avoid-unidirectional-one-to-many-association-on-a-forei –

risposta

36

Considerare la situazione in cui il tipo di entità di proprietà può anche essere di proprietà di un altro tipo di entità padre. Metti i riferimenti di chiavi esterne nella tabella di proprietà in entrambe le tabelle padre? Cosa succede se hai tre tipi di genitori? Semplicemente non si adatta a grandi progetti.

Un join-table disaccoppia il join, in modo che la tabella di proprietà non abbia alcuna conoscenza delle tabelle padre, consentendo al design di scalare elegantemente.

+1

vedere la differenza delle operazioni SQL interne invocate nella tabella di join e nella chiave esterna all'indirizzo http://stackoverflow.com/q/18333198/418439 –

11

Se l'entità figlio ha sempre un solo tipo genitore, non c'è bisogno di una tabella di join. Ho fatto questo con JPA (con un impl di ibernazione).

Vantaggi: Un tavolo in meno. Forse prestazioni migliori. No "a cosa serve questo tavolo?" tipo domande.

Svantaggio: Dal punto di vista OO è stata introdotta una dipendenza aggiuntiva tra figlio e genitore. In pratica questo probabilmente non è un grosso problema, dal momento che la relazione è privata nel bambino.

 
e.g. 
parent: 
@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL) 
@MapKey(name = "name") 
private Map children; 

child: 
@ManyToOne(optional = false) 
private Parent parent; 
+0

puoi approfondire lo svantaggio –

+0

Svantaggio raffinato. – Conor

+0

Basta notare che con JPA 2.0 il riferimento sul figlio al genitore non è più necessario. Basta usare l'annotazione @JoinColumn sul genitore. –

Problemi correlati