Вопрос по foreign-keys, associations, one-to-many, hibernate – Гибернация однонаправленная связь один ко многим - почему таблица соединений лучше?

32

В этом документе (прокрутите вниз до однонаправленного раздела):

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

в нем говорится, что однонаправленная связь «один ко многим» с таблицей соединений гораздо предпочтительнее, чем просто использование столбца внешнего ключа в принадлежащем объекте. Мой вопрос: почему это намного предпочтительнее?

увидетьstackoverflow.com/questions/2092611/... Adrien Be

Ваш Ответ

2   ответа
11

Если дочерний объект имеет только один родительский тип, тогда нет необходимости в соединительной таблице. Я'мы сделали это с помощью JPA (с гибернацией).

Преимущества: на один столик меньше. Возможно, лучшая производительность. Нет "для чего этот стол? Тип вопросов.

Недостаток: с точки зрения ОО введена дополнительная зависимость между ребенком и родителем. На практике это, вероятно, не такая уж большая проблема, поскольку отношения у ребенка являются личными.

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

child:
@ManyToOne(optional = false)
private Parent parent;
Уточненный недостаток. Conor
Просто отметьте, что в JPA 2.0 ссылка на потомка для родителя больше не нужна. Просто используйте аннотацию @JoinColumn для родителя. Edy Bourne
не могли бы вы подробнее рассказать о своем недостатке Aravind R. Yarram
@EdyBourne - Вы знаете, в какой версии Hibernate добавлена поддержка? Snekse
38

Рассмотрим ситуацию, когда принадлежащий тип сущности также может принадлежать другому родительскому типу сущности. Вы помещаете ссылки на внешние ключи в принадлежащей таблице в обе родительские таблицы? Что делать, если у вас есть три родительских типа? Это просто нет масштабировать до крупных конструкций.

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

См. Различие внутренних операций SQL, вызываемых в таблице соединений и внешнем ключе, по адресуstackoverflow.com/q/18333198/418439 Lee Chee Kiam

Похожие вопросы