OneToMany - каковы различия между таблицей соединений и внешним ключом? - PullRequest
9 голосов
/ 20 декабря 2011

Существует возможность отключить таблицу соединения отношений @OneToMany с аннотацией @JoinColumn. По умолчанию используется таблица соединения.

Каковы преимущества и недостатки, например, производственной системы?
Когда я должен использовать соединительный стол, а когда нет?

Спасибо.

Ответы [ 3 ]

19 голосов
/ 20 декабря 2011

По умолчанию @OneToMany создаст таблицу соединения только в том случае, если вы будете использовать однонаправленные отношения .

Другими словами, если у вас есть Employee и Project сущности иEmployee сущность определяется следующим образом: (предположим, что для этих сущностей нет записей orm.xml) :

@Entity
public class Employee {
    // ...

    @OneToMany
    Set<Project> projects;
}

@Entity
public class Project {
    // ...
}

поставщик JPA создаст таблицу соединения (обратите внимание, что в аннотации @OneToMany отсутствует атрибут mappedBy, поскольку в Project нет ссылки на Employee сущность).

С другой стороны, если вы будете использовать двунаправленныйотношение:

@Entity
public class Employee {
    // ...

    @OneToMany(mappedBy="employee")
    Set<Project> projects;
}

@Entity
public class Project {
    // ...

    @ManyToOne
    Employee employee;
}

Таблица соединения не будет использоваться, поскольку для хранения внешнего ключа для этого отношения будет использоваться сторона "много".

Однако вы можете принудительно использовать таблицу соединений даже в тех случаях, когда у вас есть двунаправленная связь @OneToMany с определенным атрибутом mappedBy.Вы можете достичь этого, используя аннотацию @JoinTable на стороне-владельце отношений.

Существует также возможность, как вы упомянули, использовать @JoinColumn в случае соединенияТаблица будет использоваться по умолчанию (однонаправленное отношение @OneToMany).

Лучше всего проверить FK и разницу в производительности таблицы соединения для себя.Я могу только предположить, что меньшее количество объединений (в данном случае: FK), кажется, имеет лучшую производительность.

Более того, иногда администратор баз данных определяет схему базы данных, и вам просто нужно приспособить ваши сопоставления к существующей схеме.Тогда у вас нет выбора над FK или столом присоединения - вот почему у вас есть выбор.

0 голосов
/ 31 августа 2015

Как уже упоминалось в комментариях выше, по умолчанию hibernate идет для таблицы соединений. Это приводит к лучшей нормализации БД.

Если у вас есть выбор, JoinColumn обеспечивает лучшую производительность по сравнению с таблицей объединения, так как устраняется необходимость объединения дополнительной таблицы в запросе SQL.

0 голосов
/ 11 июля 2012

Соединительные таблицы необходимы для полиморфизмов.Например, если Employee и Manager связывают один и тот же проект и они сопоставлены с помощью стратегии «одна таблица на класс» на уровне реляционной БД, единственный способ узнать, что проект (id = 1, emp_id = 10) ссылается на менеджерапоместить emp_id в таблицу manager_2_employee.Если вы не в такой ситуации, emp_id может перейти непосредственно в проект.

...