2013-01-01 6 views
26

Foo posiada:@ManyToMany (mappedBy = "foo")

@ManyToMany(mappedBy = "foos") 
private Set<Bar> bars 

i Bar posiada:

@ManyToMany 
private Set<Foo> foos 

Co za różnica lokalizacja mappedBy uczynić atrybut do dwukierunkowej relacji, inne niż to, czy tabela nazywa się foo_bar, czy bar_foo; i bez atrybutu mappedBy otrzymuję dwie tabele sprzężeń, zarówno foo_bar, jak i bar_foo.

+2

foo i bar są naprawdę kiepskim wyborem słów. Proszę rozważyć bardziej konkretne przykłady relacji istniejących w realnym świecie. – haventchecked

Odpowiedz

36

The documentation mówi:

Jeżeli stowarzyszenie jest dwukierunkowa, z jednej strony musi być właścicielem, a jedna strona musi być odwrotny koniec (tj zostanie zignorowany podczas aktualizacji wartości relacji w związku. tabela):

Tak, strona która ma atrybut mappedBy jest odwrotna strona. Stroną, która nie ma atrybutu mappedBy, jest jej właściciel.

Strona właściciela to strona, na której analizuje się stan hibernacji w celu ustalenia, które powiązanie istnieje. Na przykład, jeśli dodasz Foo, zestaw foo paska, nowy wiersz zostanie wstawiony przez Hibernate w tabeli sprzężenia. Jeśli, przeciwnie, dodasz pasek do zestawu słupków Foo, nic nie zostanie zmienione w bazie danych.

+0

co, jeśli chcę, aby się wzajemnie odzwierciedlały, jeśli pasek zostanie dodany, który powinien również zmodyfikować db? – NimChimpsky

+0

@NimChimpsky: W relacji dwukierunkowej, po zmianie Foo.bars, powinieneś odpowiednio zmieniać Bar.foos, więc nie powinieneś przejmować się tym, co zostanie zapisane w DB, kiedy modyfikujesz co. Pojęcie "własności" dotyczy tylko organizacji bazy danych, a twój kod powinien być całkowicie nieświadomy tego. –

+0

Masz dwukierunkowe powiązanie: dodając pasek do foo, dodaj także foo do paska. –

1

mappedBy mówi Hibernate, która strona relacji "jest właścicielem" łącza. W trybie OneToMany lub OneToOne użycie opcji mappyedBy mówi Hibernate, że w drugiej tabeli będzie używany klucz obcy, który będzie używany do przechowywania łącza.

Jeśli chodzi o ManyToMany, istnieje tabela sprzężenia, więc żadne z nich nie ma bezpośredniego połączenia z innym obiektem. Jednak hibernacja wciąż musi wiedzieć, która strona jest "właścicielem", która wie jak kaskadować operacje.

+1

-1: mappedBy nie wskazuje, która tabela ma klucz obcy i nie ma nic wspólnego z kaskadami. –