Вопрос

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

У меня есть класс User, и он выглядит следующим образом:

родовое слово

У меня две проблемы:

  • Hibernate вызывает у меня проблему невозможно одновременно получить несколько пакетов
  • Я поискал в Интернете, люди сказали удалить FetchType.EAGER или изменить его на Set вместо List, но в результате я получил Поле не имеет значения по умолчанию

У меня такое чувство, что отношения не определены должным образом, а также я должен видеть больше таблиц, потому что сейчас я вижу только таблицу User и таблицу User_User.


Обновить

Следующее создает 3 таблицы, друзей, подписчиков и запрашивающих. Это несколько оптимизировано по сравнению с 5 таблицами? И есть ли в этом преимущества по сравнению с тем, что предложил мистер J4mes?

родовое слово
Это было полезно?

Решение

Прежде всего, чтобы реализовать вашу функцию, вы должны использовать @ManyToMany вместо @OneToMany.Должно получиться так:

родовое слово

Мне ваши отношения кажутся двунаправленными.Если вы используете @OneToMany, это означает, что C has 2 followers A and B= A and B only follows C.Однако факт в том, что один человек может следовать за многими людьми, а за одним человеком могут следовать многие люди.Другими словами, A and B can also follow D.

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

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

Hibernate будет генерировать только одну таблицу для объекта "Пользователь", и я предполагаю, что это таблица перекрестных ссылок для отношения "Пользователь к пользователю".Обходной путь использования разных таблиц может заключаться в настройке разных сущностей для разных отношений, т.е.

Пользовательский объект

родовое слово

Подписчик

родовое слово

Что касается выборки EAGER, вам может потребоваться, чтобы все они были LAZY, поскольку в зависимости от того, как настроена ваша база данных, все эти активные нагрузки могут быть довольно дорогими.Только когда пользователь захочет загрузить подписчиков, я захочу их получить.

Отделите код User от кода Friends. Попытайтесь создать таблицу с как минимум двумя столбцами, которые отображают код User_ID на весь его код Friends_IDs, который в основном является ссылкой на код User_ID.

Также EAGER загрузит ВСЕ данные, как только вы вызовете его в первый раз.Означает, что он загрузит всех пользователей и их друзей.Загрузка друзей должна быть сгенерирована кодовым кодом, т.е. загружаться только тогда, когда они вам нужны.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top