Ответ 1
однонаправленная связь "один-ко-многим" по иностранному ключу - необычный случай, и не рекомендуется.
Есть два аспекта:
- однонаправленный
- один-ко-многим
thread @CalmStorm удалили ответные ссылки на адреса только второй из этих вещей, но пусть начнется с нее.
Этот поток рекомендует заменять отношения "один ко многим" с таблицами соединений, потому что в противном случае подход "один-ко-многим" заполняет множество боковых таблиц столбцами, которые не принадлежат этому объекту, существуют только для "связывания" поры (так в оригинале). Эта тактика может привести к чистой модели в слое Hibernate, но, к сожалению, это приводит к поломке базы данных.
Поскольку SQL может только утверждать, что у дочерней записи есть родитель; нет способа обеспечить соблюдение правила, согласно которому родитель должен иметь ребенка. Следовательно, нет никаких оснований настаивать на том, что таблица имеет записи в таблице соединений, а это значит, что становится возможным иметь осиротевшие дочерние записи, то, что предназначено для предотвращения внешних ключей.
У меня есть несколько других возражений, но следующая самая важная из них - нецелесообразность. Таблицы пересечений предназначены для представления отношений "многие ко многим". Использование их для представления отношений "один ко многим" сбивает с толку и требует слишком много дополнительных объектов базы данных по своему вкусу.
Итак, во втором аспекте: однонаправленные ассоциации "один ко многим". Проблема заключается в том, что Hibernate обрабатывает их по умолчанию. Если мы вставляем родительский элемент и дочерний объект в одну транзакцию, Hibernate вставляет дочернюю запись, затем он вставляет родительский элемент, а затем обновляет дочерний элемент родительским ключом. Это требует отложенных ограничений внешнего ключа (yuck!) И, вероятно, отложенных и ненулевых ограничений (двойной yuck).
Существует несколько способов обхода. Один из них - использовать двунаправленные ассоциации "один ко многим". Согласно в документе, который вы цитируете, это наиболее распространенный подход. Другой подход состоит в том, чтобы настроить отображение дочернего объекта, но имеет свои собственные ветвления.