2009-09-04 19 views
27

mam relacja jeden-do-wielu modelowane za pomocą dołączyć tabelę:jeden-do-wielu z Dołącz Tabela

create table t1 (id int primary key, name varchar(10) /*...*/); 
create table t2 (id int primary key, name varchar(10) /*...*/); 
create table t1_t2 (t1_id int, t2_id int, primary key (t1, t2)); 

Tabele mają modelować relację jeden do wielu t1 t2. Jaki jest właściwy sposób modelowania tych tabel za pomocą JPA?

+1

myślę, że można znaleźć to, czego szukasz w https://en.wikibooks.org/wiki/Java_Persistence/OneToMany#Example_of_a_OneToMany_using_a_JoinTable_database – Legna

Odpowiedz

46

Typową tabelą dla jednego T1 do wielu T2 jest posiadanie obcego klucza na T2 skierowanego w stronę T1. Tabela T1_T2 zwykle nie jest potrzebna.

Struktura JPA byłaby wtedy One-To-Many, ewentualnie dwukierunkowa.


Może istnieć kilka ustaleń, aby struktura, którą opisujesz, działała. Można zmienić T1_T2:

  • dodać wyjątkową presję na T2 (tak, że tylko jedna T2 jest dozwolone)

Czy naprawdę tego chcesz?

Zmieniano: tak, to jest to, co chcesz ;-)

wątpię można znaleźć wiele przykładów w sieci. Nie mam żadnego udowodnionego rozwiązania, ale spróbowałbym czegoś podobnego:

W Hibernate annotation reference documentation, patrz "2.2.5.3.2.3 Jednokierunkowy z tabelą łączenia", aby uzyskać pomysł. Wygląda to tak:

@Entity 
    public class Trainer { 
     @OneToMany 
     @JoinTable(
      name="TrainedMonkeys", 
      joinColumns = @JoinColumn(name="trainer_id"), 
      inverseJoinColumns = @JoinColumn(name="monkey_id") 
     ) 
     public Set<Monkey> getTrainedMonkeys() { 
     ... 
    } 
+2

dzięki za odpowiedź. To prawda, że ​​moja nie jest najbardziej typową strukturą, ale mam inne powody, które czynią ją bardziej odpowiednią. Unikalne ograniczenie na T2 jest możliwe, ale nadal nie rozumiem, jak powinienem go modelować za pomocą adnotacji JPA. Czy mógłbyś wyjaśnić dalej? –

+0

OK. Jestem ciekawy, co może sprawić, że ten projekt będzie "bardziej odpowiedni". Czy możesz podać kilka wskazówek, aby poprawić swoją wiedzę na wypadek, gdy będę tego potrzebował w przyszłości? – KLE

+5

Dziękuję. To naprawdę pouczające. Jeśli chodzi o projekt, kiedy liczba rekordów w T2, które są faktycznie powiązane z T1, jest stosunkowo niewielka, możesz zdecydować się na oddzielną tabelę złączeń zamiast posiadania 't1_id' w T2, która w większości jest' NULL'. –