работа с отношениями один-ко-многим в спящем режиме - PullRequest
1 голос
/ 17 июля 2009

Я все еще изучаю, что может сделать hibernate, и на этот раз я пытаюсь что-то, что, кажется, не работает. У меня есть 2 таблицы пользователей и контактов. Как вы можете догадаться, контакты держат отношения, используя user_id в качестве внешнего ключа. Вот фрагмент из 2 картографических файлов. это первое из users.hbm.xml

<set name="contactsdetails">
  <key column="userId"/>
  <one-to-many class="Domain.Contacts"/>
</set>

а это из contacts.hbm.xml

<many-to-one class="Domain.Users" name="userId"/>

пока все работает, я имею в виду настройку, отображение файла и вставку в таблицу пользователей из UsersDAO, я хочу вставлять в пользователей и контакты одновременно. Это означает, что я создаю свой пользовательский объект и присваиваю значения различным свойствам, создаю один или массив контактов и присваиваю ему различные свойства и, наконец, добавляю его в свойство набора контактов по умолчанию, прежде чем сохранить объекты пользователей. Когда я попытался это сделать, я понял, что это немного странно, потому что свойство контакта userId относится к типу users, поэтому я добавлю пользователя в контакты или каждый объект контактов, а затем добавлю тот же объект contacts в свойство contactsdetails пользователей, прежде чем сохранить объекты пользователя. Я уверен, что Я что-то упустил, и у меня возникла нулевая попытка, когда я попробовал. Не могли бы вы показать мне, как это сделать? спасибо за чтение

Ответы [ 2 ]

1 голос
/ 17 июля 2009

Когда у вас есть сущность A, указывающая на сущность B, а сущность B указывает на сущность A, у вас есть то, что hibernate называет двунаправленным отображением. Это может быть сложно, и вы должны быть осторожны, а также сказать hibernate, что одна сторона «владеет» отношениями.

См. раздел Двунаправленных ассоциаций в документах гибернации о том, как управлять этими ассоциациями.

0 голосов
/ 19 июля 2009

Вы должны сообщить Hibernate, какая сторона «владеет» отношениями. Обычно я считаю, что сторона «многие к одному» является самой простой. Для этого добавьте inverse = "true" к одной стороне сопоставления.

<set name="contactsdetails" <!---->inverse="true"<!---->>
  <key column="userId"/>
  <one-to-many class="Domain.Contacts"/>
</set>

Из документации:

Изменения, внесенные только в обратный конец ассоциации, не сохраняются. Это означает, что у Hibernate есть два представления в памяти для каждой двунаправленной ассоциации: одна ссылка от A до B и другая ссылка от B до A. Это легче понять, если вы подумаете об объектной модели Java и о том, как отношение многие ко многим в Java создано:

category.getItems().add(item);          // The category now "knows" about the relationship
item.getCategories().add(category);     // The item now "knows" about the relationship

session.persist(item);                   // The relationship won't be saved!
session.persist(category);               // The relationship will be saved

Не обратная сторона используется для сохранения представления в памяти в базе данных.

...