Hibernate @OneToMany сопоставление отношений
-
27-10-2019 - |
Вопрос
Я пытаюсь создать отношения между пользователем и пользователем, например, «пользователь 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
загрузит ВСЕ данные, как только вы вызовете его в первый раз.Означает, что он загрузит всех пользователей и их друзей.Загрузка друзей должна быть сгенерирована кодовым кодом, т.е. загружаться только тогда, когда они вам нужны.