Таблица друзей java

Как реализовать таблицу друзей? При использовании анотаций @ManyToMany и @JoinTable я могу выгружать данные, запрашиваемые по одному столбцу.

Есть таблица friend с полями friend1 и friend2.
Если один является другом другого, то эта связь работает и обратно (если а - друг б, то б - друг а).
Как выгружать данные о друзьях, проверяя оба столбца?

Вобщем всё что нужно: искать юзера в обоих столбцах и из противоположного забирать друга, но как это реализуется в hibernate?


Ответы (1 шт):

Автор решения: Byb

Не уверен, что правильно понял ваш вопрос, но попробую.

Предположим, у нас есть таблица 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 получаете суммарно всех его друзей, если они есть.

Тут у нас получается, что сущность вступает в отношение "Многие-ко-многим" сама с собой. Я до этого никогда такой случай не рассматривал, поэтому, возможно, приведённый мной вариант не сработает. Но теоретически должен.

→ Ссылка