Почему однонаправленная ассоциация «один ко многим» на внешнем ключе является необычным случаем и не рекомендуется? - PullRequest
2 голосов
/ 27 октября 2011

По ссылке http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/associations.html#assoc-unidirectional-m21 говорится, что

Однонаправленная связь один-ко-многим на внешнем ключе является необычным случаем и не рекомендуется.Вместо этого в документации рекомендуется выполнять однонаправленное 1-к-M с использованием таблицы соединений.

Я не уверен, почему в документации говорится, что это необычный случай и не рекомендуется .Поскольку, по моему опыту, это очень распространенный случай, когда у клиента может быть много счетов в банке, поэтому между клиентом и счетом будет 1011 * связь, в которой у клиента будут ассоциативные счета, которые будут собирать счета для этого клиента.

Так зачем нам в этом случае вводить таблицу соединений?

Ответы [ 3 ]

4 голосов
/ 27 октября 2011

То, что сказал @Алекс, было правильным. Этот ответ состоит из двух частей.

Мне тоже кажется, что дело не необычно . Однако, согласно вашему примеру, если Customer имеет коллекцию Account, поддерживает сценарий. Однако в примере Учетная запись НЕ МОЖЕТ существовать без Клиента. . Рассмотрим другой сценарий, в котором элемент коллекции не зависит от Владельца.

Скажем, связь между Owner и Car. У владельца много автомобилей, следовательно, one-to-many отношение между Owner Entity и Car Entity. Структура базы данных будет

Owner : [OwnerId, Name...]
Car   : [CarId, Name...., OwnerId]

Здесь мы предполагаем, что Автомобиль МОЖЕТ существовать без владельца . В таком состоянии будут записи автомобилей с null OwnerId. Наличие null ухудшает информацию. Под ухудшением я подразумеваю, что качество хранимой информации снижается, поскольку есть неизвестные. Приведенная выше структура может быть смоделирована до

 Owner    : [OwnerId, Name...]
 Car      : [CarId, Name....]
 CarOwner : [OwnerId,CarId]

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

(как правильно заметил @Alex)
В Hibernate one-to-many отношение не распознает таблицу соединений. Поэтому мы используем many-to-many с флагом unique, установленным в true, чтобы отобразить отношение. Однако, если вы введете таблицу соединений, это излишне увеличит количество соединений.

Надеюсь, это объяснение поможет.

1 голос
/ 27 октября 2011

На этот вопрос ответили здесь на форумах Hibernate.

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

Наличие таблицы соединений устраняет это несоответствие.

0 голосов
/ 27 октября 2011

Вы имеете в виду?

table customer(id, idAccount)

id  |  idAccount
1         1
1         2

с таблицей соединений:

table customer(id)

id |
 1

table join (idCustomer, idAccount)

idCustomer  | idAccount
     1            1
     1            2

Получение Customer даст только одну строку. Поскольку Customer pojo будет отображаться в customer в дБ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...