Hibernate / JPA ManyToOne против OneToMany

В настоящее время я читаю документацию Hibernate относительно ассоциаций сущностей, и я немного затрудняюсь выяснить некоторые вещи. Это должно быть сделано по существу с различием между ManyToOne и OneToMany . Хотя я использовал их в реальных проектах, я не могу полностью понять разницу между ними. Насколько я понимаю, если таблица / сущность имеет ассоциацию ManyToOne с другой, то ассоциация должна быть с другой стороны OneToMany . Итак, как нам решить, какой из них выбрать на основе конкретного случая и как он влияет на базу данных / запросы / результаты? Есть ли повсюду хороший пример?

PS: Я считаю, что это было бы полезно из-за его релевантности в вопросе, если бы кто-то мог, кроме того, объяснить, какова точка владельца ассоциации и разница между двунаправленной и однонаправленной ассоциацией.

Предположим, что у вас есть заказ и заказ. Вы можете выбрать однонаправленную OneToMany между Order и OrderLine (у Order будет коллекция OrderLines). Или вы можете выбрать связь ManyToOne между OrderLine и Order (OrderLine будет иметь ссылку на свой Ордер). Или вы можете выбрать оба варианта, и в этом случае ассоциация становится двунаправленной ассоциацией OneToMany / ManyToOne.

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

Предположим, у вас есть Пользователь и Сообщение, где у пользователя могут быть тысячи сообщений, может иметь смысл моделировать его только как ManyToOne от Message to User, потому что вы редко будете запрашивать все сообщения пользователя в любом случае. Связь может быть сделана двунаправленной только для помощи с запросами, поскольку, поскольку запросы JPQL соединяются между объектами путем навигации по их ассоциациям.

В двунаправленной связи вы можете оказаться в ситуации, когда график объектов несовместим. Например, Order A будет иметь пустой набор OrderLines, но некоторые OrderLines будут иметь ссылку на заказ A. JPA налагает обязательство всегда иметь одну сторону ассоциации, являющуюся стороной владельца, а другая сторона является обратной стороной. Обратная сторона игнорируется JPA. Сторона владельца – это сторона, которая решает, какое отношение существует. В двунаправленной ассоциации OneToMany сторона владельца должна быть большой стороной. Таким образом, в предыдущем примере сторона владельца была бы OrderLine, и JPA сохраняла бы связь между строками и порядком A, поскольку строки имеют ссылку на A.

Такая ассоциация будет отображаться следующим образом:

в порядке :

 @OneToMany(mappedBy = "parentOrder") // mappedBy indicates that this side is the // inverse side, and that the mapping is defined by the attribute parentOrder // at the other side of the association. private Set lines; 

в OrderLine:

 @ManyToOne private Order parentOrder; 

Кроме того, если @ManytoOne сторона как владелец потребует только n + 1 запросов при сохранении ассоциаций. Где n – количество ассоциаций (много сторон).

Принимая во внимание, что @OneToMany как владелец, при вставке родительского объекта (с одной стороны) с ассоциациями (много сторон) приведет к 2 * N + 1 запросам. В котором один запрос был бы для вставки ассоциации, а другой запрос – для обновления внешнего ключа в связанном объекте.

  • Hibernate: где insertable = false, updatable = false принадлежит составным созвездиям первичных ключей с участием внешних ключей?
  • JPA Query.getResultList () - используется в общем виде
  • Как работает FetchMode в Spring Data JPA
  • Java - JPA - аннотация @Version
  • Java, JPA, Glassfish, Invalid resource: jdbc / __ default__pm
  • JPA Query выбирает только определенные столбцы, не используя Query Query?
  • Проблема спящего режима - «Использование @OneToMany или @ManyToMany для таргетинга на немаркированный class»
  • JPA нетерпеливый выбор не присоединяется
  • интернационализация в JSF с записями ResourceBundle, которые загружаются из базы данных
  • Как правильно настроить EntityManager в приложении jersey / hk2?
  • Когда JPA устанавливает @GeneratedValue @Id
  • Interesting Posts

    Почему в предложении DEFAULT может быть только один столбец TIMESTAMP с CURRENT_TIMESTAMP?

    Как запустить основной class sbt из оболочки в качестве обычной командной строки?

    Поведение статического метода в многопоточной среде в java

    Ошибка при использовании Xcode 5.0 и Rcpp (средства командной строки ARE установлены)

    Как проверить, является ли массив пустым / пустым?

    Выполнение задачи пользовательского интерфейса в doinbackground () в Android

    Список инициализации элемента C ++

    Дополнения Firefox на seamonkey

    Добавление раздела NTFS на диск в Windows делает раздел HFS + на том же диске невидимым в Mac OS X

    Сложность времени для Java ArrayList

    Как получить координаты экрана с маркера в google maps v2 android

    Почему static_cast не может использоваться для down-cast, когда задействовано виртуальное наследование?

    Можно ли безопасно использовать OpenMP с C ++ 11?

    Есть ли команда DOS (cmd.exe из Win7) для извлечения флэш-накопителя?

    Сетевой адаптер VirtualBox не удается установить

    Давайте будем гением компьютера.