#java #hibernate
#java #переход в спящий режим
Вопрос:
У меня есть отношение один ко многим между Person и классом Address. Согласно документу Hibernate, многие стороны всегда являются стороной-владельцем отношения, то есть многие стороны не должны определять элемент mappedBy.
в моем случае у одного человека может быть много адресов, поэтому Person соответствует одной стороне, а Address соответствует многим сторонам. Если я не определяю элемент mappedBy в обоих классах, какой класс становится владельцем отношения?
Всегда ли таблица-владелец имеет отображение внешнего ключа?
Ответ №1:
Да, таблица объекта-владельца всегда является таблицей с внешним ключом.
Обидно, что авторы спецификации JPA решили назвать эту сущность «владельцем» отношений. Это имя противоречит терминологии, связанной с агрегацией, которая часто будет использоваться в одно и то же время. Например, в вашем случае Человек владеет Адресом (если вы удалите Человека, вы удалите все его адреса; если вы удалите Адрес, вы не удалите Человека, которому он принадлежит). Однако именно Адресу принадлежат отношения между Человеком и Адресом.
На самом деле, «сторона-владелец» просто означает «сторона, у которой есть таблица, которая фактически определяет внешний ключ, используемый для записи отношения».
Ответ №2:
Если вы не укажете mappedBy, то у вас нет двунаправленной связи. Вместо этого у вас будут две однонаправленные связи.
В отношениях «один ко многим» внешний ключ должен находиться в таблице владельцев или в отдельной таблице соединений. Вы не можете иметь это в таблице с одной стороны отношения «один ко многим». Не имеет смысла размещать его на одной стороне, потому что вы не можете сопоставить многие значения (внешние ключи, ссылающиеся на таблицу многих сторон) с одним столбцом одной строки с помощью JPA.