2009-08-20 7 views
30

W niniejszym dokumencie (w dół do sekcji jednokierunkowy):Hibernacja jednokierunkowy jedno do wielu skojarzeń - dlaczego lepiej jest połączyć tabelę?

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

mówi, że jednokierunkowy stowarzyszenie jeden-do-wielu z tabelą przyłączenia jest znacznie wolał po prostu stosując kolumnę klucza obcego w posiadany podmiot. Moje pytanie brzmi: dlaczego jest to zdecydowanie preferowane?

+0

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

Odpowiedz

36

Należy wziąć pod uwagę sytuację, w której właścicielem typu jednostki może być również inny typ podmiotu dominującego. Czy umieścisz referencje kluczy obcych w posiadanej tabeli do obu tabel nadrzędnych? Co jeśli masz trzy typy rodziców? Po prostu nie skaluje się do dużych projektów.

Tablica sprzężenia oddziela połączenie, dzięki czemu posiadana tabela nie ma wiedzy o tabelach rodzica, co pozwala na eleganckie skalowanie projektu.

+1

Zobacz różnicę wewnętrznych wywołań SQL wywoływanych w tabeli łączenia i kluczu obcym pod adresem http://stackoverflow.com/q/18333198/418439 –

11

Jeśli element podrzędny ma tylko jeden typ nadrzędny, wówczas nie ma potrzeby łączenia tabeli. Zrobiłem to z JPA (z implikacją hibernacji).

Zalety: Jeden mniej tabeli. Być może lepsza wydajność. Nie "do czego służy ta tabela?" wpisz pytania.

Wada: Z perspektywy OO wprowadzono dodatkową zależność między dzieckiem a rodzicem. W praktyce nie jest to prawdopodobnie tak wielka sprawa, ponieważ związek ten jest prywatny w dziecku.

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

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

. Możesz rozwinąć więcej na temat dyskryminacji. –

+0

Wyrafinowana wada. – Conor

+0

Należy pamiętać, że w przypadku wersji JPA 2.0 odniesienie do dziecka do rodzica nie jest już konieczne. Po prostu użyj adnotacji @JoinColumn na rodzica. –

Powiązane problemy