Гибернация однонаправленная связь один ко многим - почему таблица соединений лучше? - PullRequest
32 голосов
/ 20 августа 2009

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

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

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

Ответы [ 2 ]

38 голосов
/ 20 августа 2009

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

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

11 голосов
/ 20 августа 2009

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

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

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

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

child:
@ManyToOne(optional = false)
private Parent parent;
...