Почему ассоциация «один ко многим» не может быть двунаправленной, а должна быть просто однонаправленной?

Я пытаюсь узнать о JPA и Hibernate, и я пытался узнать о некоторых терминах базы данных.

В видео на ютубе учитель (в 2:42) сказал:

One-To-Many is only Unidirectional.

и она сказала, допустим, эти два класса:

class Person {

    List<Address> addresses;

}


class Address {

    Person p;

}

и она сказала:

this is One-To-Many. but Address cannot have a collection of Person because if it has a collection of Person, it's going to be Many-To-Many.

но я думаю, что она не права, потому что мы можем иметь эти два:

thePerson.getAddresses().get(i);

и

anAddress.getPerson();

Когда у нас могут быть эти два утверждения, тогда это Двунаправленный. Тогда почему она сказала, что это может быть просто Однонаправленный?

Каково точное определение Двунаправленный, с помощью которого она пришла к такому выводу?

3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
0
0
41
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы правы, она не права. Все виды отношений могут быть однонаправленными или двунаправленными.

На дочерней стороне вы должны аннотировать поле с помощью @JoinColumn.

На родительской стороне вы должны использовать свойство mappedBy аннотации @OneToMany.

Пример:

@OneToMany(mappedBy = "user")
private List<Address> addresses;

@ManyToOne
@JoinColumn
private User user;

Вот хорошая лекция об этом.

https://vladmihalcea.com/the-best-way-to-map-a-onetomany-association-with-jpa-and-hibernate/

Ответ принят как подходящий

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

When we can have these two statements, then it is Bidirectional. Then why she said it can be just Unidirectional?

Существует также большое несоответствие между object oriented подходом ORMs как Hibernate и тем, как таблицы и отношения определяются в relational database. Она может быть правильной, потому что с точки зрения базы данных отношения по умолчанию однонаправленный.

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

What is Bidirectional's exact definition with which she came to such a conclusion?

В вашем примере мы можем интерпретировать ваши отношения следующим образом:

  • Однонаправленный: вы можете получить все свои адреса от человека, но не наоборот

     class Person {
    
         @OneToMany
         List<Address> addresses;
    
     }
    
     class Address {
    
         // Here you don't add the ManyToOne
         Person p;
     }
    
  • Двунаправленный: вы можете получить все свои адреса от человека и получить человека от адреса

     class Person {
    
         @OneToMany
         List<Address> addresses;
     }
    
     class Address {
    
         @ManyToOne
         Person p;
     }
    

Взгляните на эти ссылки ниже:

Разница между однонаправленными и двунаправленными реляционными отношениями

https://www.baeldung.com/spring-data-rest-relationships

Что такое объектно-реляционное несоответствие

Гарри, когда для этих двух классов мы предоставляем все геттеры, то у нас всегда двунаправленный. Правильно?

user18797468 23.04.2022 02:20

@TomWard нет, как только вы определяете аннотацию в обоих классах, они становятся двунаправленными. Эти аннотации следует рассматривать с точки зрения Hibernate и Java. Это помогает платформе узнать, как управлять вашими данными и извлекать их.

Harry Coder 23.04.2022 02:22

нет, я имею в виду только в мире ООП и без спящего режима и jpa. если мы предоставляем все геттеры, то у нас всегда двунаправленный. Правильно? Я в замешательстве. потому что с thePerson.getAddresses().get(i); и anAddress.getPerson(); я вижу, что это двунаправленный. просто с предоставлением геттеров для обеих сторон.

user18797468 23.04.2022 02:27

@TomWard да, в мире ООП это также означает, что ваши отношения двунаправлены.

Harry Coder 23.04.2022 02:29

Другие вопросы по теме