Таблица друзей java
Как реализовать таблицу друзей? При использовании анотаций @ManyToMany и @JoinTable я могу выгружать данные, запрашиваемые по одному столбцу.
Есть таблица friend с полями friend1 и friend2.
Если один является другом другого, то эта связь работает и обратно (если а - друг б, то б - друг а).
Как выгружать данные о друзьях, проверяя оба столбца?
Вобщем всё что нужно: искать юзера в обоих столбцах и из противоположного забирать друга, но как это реализуется в hibernate?
Ответы (1 шт):
Не уверен, что правильно понял ваш вопрос, но попробую.
Предположим, у нас есть таблица man, описывающая человека, и соответствующий ей класс Man. Люди дружат в отношении "Многие-ко-многим".
Первая реализация этого отношения, которая приходит на ум, - сочетание @ManyToMany и @JoinTable. Однако есть и другой способ построить отношение "Многие-ко-многим": через @ManyToOne и @OneToMany.
Таблица friend отвечает за связывание друзей посредством столбцов friend1 и friend2. Соответствующий ей класс Friend можно сделать таким:
// ...
@Entity
public class Friend {
// ...
@ManyToOne
@JoinColumn(name = "friend1")
private Man firstFriend;
@ManyToOne
@JoinColumn(name = "friend2")
private Man secondFriend;
// ...
}
А класс Man тогда может выглядеть так:
// ...
@Entity
public class Man {
// ...
@OneToMany(mappedBy = "firstFriend")
private List<Friend> friendsFirstPart;
@OneToMany(mappedBy = "secondFriend")
private List<Friend> friendsSecondPart;
// ...
}
Теперь вы берёте нужного юзера из БД по айди любым способом, и в списках friendsFirstPart и friendsSecondPart получаете суммарно всех его друзей, если они есть.
Тут у нас получается, что сущность вступает в отношение "Многие-ко-многим" сама с собой. Я до этого никогда такой случай не рассматривал, поэтому, возможно, приведённый мной вариант не сработает. Но теоретически должен.