2009-09-04 3 views
27

У меня есть отношения один-ко-многим моделируется с помощью присоединиться к таблице:отношение один ко многим с Join Table

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)); 

Таблицы должны моделировать отношения одного t1 до t2 многих. Каков правильный способ моделирования этих таблиц с помощью JPA?

+1

Я думаю, что вы можете найти то, что вы ищете в https://en.wikibooks.org/wiki/Java_Persistence/OneToMany#Example_of_a_OneToMany_using_a_JoinTable_database – Legna

ответ

46

Типичная таблица для одного T1 для многих T2 должна иметь внешний ключ на T2, направленный к T1. Таблица T1_T2 обычно не нужна.

Структура JPA тогда была бы «Один-ко-многим», возможно, с двух сторон.


Возможно, есть договоренности, чтобы описать структуру, которую вы описываете. Вы можете изменить T1_T2:

  • добавить уникальное ограничение на Т2 (так что только одна T2 разрешено)

Это действительно то, что вы хотите?

Отредактировано: да, это то, что вы хотите ;-)

Я сомневаюсь, что вы можете найти много примеров на сети. У меня нет доказанного решения, но я бы попробовал что-то в этом направлении:

В Hibernate annotation reference documentation, см. «2.2.5.3.2.3. Однонаправленный с помощью таблицы соединений», чтобы получить эту идею. Это выглядит следующим образом:

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

Спасибо за ваш ответ. Это правда, что моя не самая типичная структура, но у меня есть другие причины, которые делают ее более подходящей. Единственное ограничение на T2 возможно, но я все еще не понимаю, как я должен моделировать его с помощью аннотаций JPA. Не могли бы вы объяснить, пожалуйста? –

+0

ОК. Мне любопытно, что может сделать этот дизайн «более подходящим». Не могли бы вы дать какие-то намеки, чтобы улучшить свои знания в случае, если мне это понадобится в будущем? – KLE

+5

Спасибо. Это действительно информативно. Что касается дизайна, когда количество записей в T2, которые фактически связаны с T1, относительно невелико, вы можете выбрать наличие отдельной таблицы соединений, а не иметь t1_id в T2, который в основном является «NULL». –

Смежные вопросы