Подтвердить что ты не робот

Hibernate - зачем использовать "много-к-одному" для представления "один к одному"?

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

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

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

Книга объясняет, как (цитируя это):

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

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

Спасибо.

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

Ответ 3

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

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

class Person, properties: address table Person, columns: id, name table Адрес, столбцы: id, city

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

  • класс Person → свойства: адрес
  • table Person → columns: id, name, addressid (fk)
  • table Address → columns: id, город

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

  • класс Person → свойства: адрес
  • table Person → columns: id, name, addressid (fk), shippingaddressid (fk)
  • table Address → columns: id, город

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

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

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

Короче:

  • в OR сопоставление один-на-один сложнее обрабатывать
  • один к одному имеет ограничения
  • используя много к одному, является более гибким, и то же самое можно достичь с помощью

Ответ 4

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

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

Ответ 5

Как я понимаю, hibernate требует, чтобы первичный ключ обоих объектов соответствовал отношениям 1 к 1. Многие из 1 избегают этого требования.

Однако многие до 1 теряют информацию о том, что на стороне может быть только один или, возможно, объект.