Hibernate картографическая путаница - PullRequest
1 голос
/ 23 февраля 2011

Нижеприведенное определение взято из Руководства по отображению ассоциации Hibernate здесь

Каждая книга относится к одному издателю, в то время как один издатель может опубликовать много книг.

Я бы представлял приведенное выше определение следующим образом в Java

class Book
{
  Publisher pub;
}

class Publisher
{
  Set<Book> books;
}

Вопрос 1. Теперь я не совсем понимаю, почему в учебнике написано Связь между книгой и издателемназывается ассоциация «многие-к-одному» . Я думал Между издателем и книгой существует 1018 * ассоциация «один-ко-многим» .был правильный подход.

Вопрос 2. Ниже приведено объяснение книги.Почему бы нам не объявить один-ко-многим в отображении hbm Издателя.Что определяет местоположение для этого сопоставления отношений?

<class name="Book" table="BOOK"> 
  <many-to-one name="publisher" class="Publisher" column="PUBLISHER_ID" /> 
</class>

Ответы [ 4 ]

2 голосов
/ 23 февраля 2011

зависит от того, являются ли отношения двунаправленными.См. Раздел 7.3.2 здесь http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/collections.html#collections-mapping.

двунаправленная связь - это когда вы можете переходить как от родителя к ребенку (т. Е. Publisher -> Book), так и от потомка к родителю (т. Е. Book -> Publisher).Родитель-ребенок - это один-ко-многим, а потомок-родитель - это многие-к-одному.

Обратите внимание, что вам не нужны двунаправленные отношения.«Правильный подход» зависит именно от того, что нужно вашему приложению.Если вам нужно только перейти с pu.lisher на книгу, вам нужен только один ко многим.Если вам нужно только перейти от книги к издателю, то вам просто нужно много к одному.Если вам нужно и то, и другое, вы можете иметь оба (то есть сделать отношения двунаправленными) /

1 голос
/ 23 февраля 2011

Отношения могут быть однонаправленными или двунаправленными.

То, как вы спроектировали его в своем коде Java, это двунаправленный. Это означает, что одно и то же физическое отношение (материализованное внешним ключом) рассматривается как два логических отношения:

  1. с точки зрения книги: несколько книг издано одним издателем (ManyToOne)
  2. с точки зрения издателя: один издатель публикует несколько книг (OneToMany)

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

Hibernate дает вам выбор: у вас может быть коллекция книг в классе издателей (однонаправленная одна ко многим) или ссылка на издателя в классе книг (однонаправленная много к одному), или и то и другое (двунаправленная одна ко многим / много к одному).

Прочитайте документацию для более подробной информации.

1 голос
/ 23 февраля 2011

Вопрос 1: На самом деле оба верны. Это зависит от направления отношений. Многие книги принадлежат одному издателю, что приводит к отношениям "многие к одному" со стороны книги.

Вопрос 2: Если вас интересуют двунаправленные отношения, вы можете поместить один ко многим с одной стороны и много к одному с другой. Однако вы должны быть осторожны, чтобы использовать атрибут mappedBy, чтобы гарантировать, что hibernate знает, что его одинаковые отношения определены с обоих концов.

1 голос
/ 23 февраля 2011

Ассоциация от Book до Publisher равна многие-к-одному , поскольку на одного издателя может приходиться много книг.Это не имеет отношения к тому факту, что Book знает только о своем собственном Publisher.Ассоциация призвана помочь Hibernate понять базовое представление.

Нет ничего плохого в том, чтобы также объявить отношение один-ко-многим от Publisher до Book.Вы можете иметь оба подарка.Это зависит от вашей модели данных и от того, как вы планируете взаимодействовать с ней.

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