Hibernate - зачем использовать многие-к-одному, чтобы представлять один к одному - PullRequest
41 голосов
/ 16 марта 2010

Я видел, как люди использовали сопоставления «многие к одному» для представления отношений «один к одному». Я также читал это в книге Гэвина Кинга и в статьях.

Например, если клиент может иметь ровно один адрес доставки, а адрес доставки может принадлежать только одному клиенту, сопоставление будет иметь вид:

<class name="Customer" table="CUSTOMERS">
    ...
    <many-to-one name="shippingAddress"
                 class="Address"
                 column="SHIPPING_ADDRESS_ID"
                 cascade="save-update"
                 unique="true"/>
    ...
</class>

Книга рассуждает так (цитируя ее):

"Вам все равно, что находится на целевой стороне ассоциации, поэтому вы можете рассматривать ее как к-одному ассоциацию без many части."

Мой вопрос: зачем использовать many-to-one, а не one-to-one? Что такое one-to-one, что делает его менее желательным вариантом для many-to-one?

Спасибо.

Ответы [ 5 ]

33 голосов
/ 16 марта 2010

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

В более позднем случае спящий способ отобразить это состоит в использовании ассоциации many-to-one (которая позволяет указать внешний ключ).

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

Другими словами, использование many-to-one - это способ сопоставления однозначных связей внешних ключей (которые на самом деле могут быть более частыми, чем общий первичный ключ один к одному ассоциации ).

5 голосов
/ 29 января 2016

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

f.e. если вы создадите класс Person и Address , которые связаны с таблицами с одинаковыми именами, у каждого пользователя будет ровно один адрес ...

  • класс Person -> свойства: адрес
  • таблица Person -> столбцы: id, имя
  • Адрес таблицы -> столбцы: id, город

При много-к-одному структура таблицы немного меняется, но тот же эффект может быть достигнут ...

  • класс Person -> свойства: адрес
  • таблица Person -> столбцы: идентификатор, имя, addressid (fk)
  • Адрес таблицы -> столбцы: id, город

... но даже больше. Теперь этот человек может иметь несколько адресов:

  • класс Person -> свойства: адрес
  • таблица Person -> столбцы: идентификатор, имя, addressid (fk), shippingaddressid (fk)
  • Адрес таблицы -> столбцы: id, город

Два внешних ключа (addressid и shippingaddressid) могут указывать на одну запись в БД ... или один адрес может принадлежать 2-3 лицам. так что, что многие-к-одному со стороны человека, это одно-ко-многим со стороны адреса.

и просто догадайтесь, как выглядит связь один-ко-многим только с одним предметом? Да, как один-на-один ...

ПРИМЕЧАНИЕ: адрес на самом деле должен быть объектом значения , не должен совместно использоваться в БД (так что это глупый пример, но я думаю, что это будет нормально).

Короче говоря:

  1. в ИЛИ сопоставлении один-к-одному сложнее справиться
  2. у каждого есть свои ограничения
  3. вместо того, чтобы использовать множество к одному, более гибко, и того же можно достичь с помощью
3 голосов
/ 16 марта 2010

Я бы сказал, что проблема в основном связана с несоответствием объектно-реляционного импеданса. Чтобы иметь возможность связать два представления объектов в базе данных, вам необходимо иметь какую-то связь между их таблицами. Однако базе данных известно только отношение 1: N: все остальные получены из нее.

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

0 голосов
/ 16 апреля 2014

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

Однако при значении «один к одному» теряется информация о том, что на многогранной стороне должен быть только один объект или, возможно, никакой объект.

0 голосов
/ 16 марта 2010

Это даже в официальных документах Hibernate: http://docs.jboss.org/hibernate/core/3.3/reference/en/html/associations.html#assoc-bidirectional-121.

Это не совсем необоснованно. Конец много-к-одному говорит: я сопоставлен через один из моих столбцов с идентификатором -one конца Вы бы использовали ту же схему базы данных для многих к одному.

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