Много ко многим на одной сущности - PullRequest
0 голосов
/ 26 января 2019

Я хочу создать приложение в стиле Instagram. Таким образом, пользователь должен иметь список пользователей, которые следуют, а также список пользователей, которые следуют за ним.
Вот что я сделал до сих пор:

@ManyToMany(cascade = {
        CascadeType.PERSIST,
        CascadeType.MERGE
})
@JoinTable(name = "following_followers",
        joinColumns = @JoinColumn(name = "user_id"),
        inverseJoinColumns = @JoinColumn(name = "followedby_id")
)
private List<User> followers;

@ManyToMany(cascade = {
        CascadeType.PERSIST,
        CascadeType.MERGE
})
@JoinTable(name = "following_followers",
        joinColumns = @JoinColumn(name = "followedby_id"),
        inverseJoinColumns = @JoinColumn(name = "user_id")
)
private List<User> following;

Я проверил этот пост, и я сделал это после хорошего ответа там, но я не совсем уверен, работает ли это.

Ответы [ 2 ]

0 голосов
/ 27 января 2019

Это было мое решение вашей проблемы.Класс пользователя:

@Entity
public class User {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private long id;

    private String name;

    @OneToMany(mappedBy="to")
    private List<Followers> followers;

    @OneToMany(mappedBy="from")
    private List<Followers> following;

    public User() {}

    public User(String name) {
        this.name = name;
    }

}

Как вы можете видеть, класс пользователя имеет ссылку на пользователей, которые следуют, и тех, за кем он следует.

@Entity
public class Followers {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private long id;

    @ManyToOne
    @JoinColumn(name="from_user_fk")
    private User from;

    @ManyToOne
    @JoinColumn(name="to_user_fk")
    private User to;

    public Followers() {};

    public Followers(User from, User to) {
        this.from = from;
        this.to = to;
    }
}

Класс последователей содержит отношениямежду двумя пользователями, конечно, вам может понадобиться добавить больше информации в этот класс, например, когда «от» начался подписка »до«.

Если вы хотите получить последователей / подписчиков пользователя, просто позвонитесоответствующий добытчик.

0 голосов
/ 26 января 2019

Проблема с ассоциацией many-to-many, управляемой Hibernate, заключается в том, что вы не можете самостоятельно управлять таблицей соединений following_followers. Например, вы не можете удалить запись из такой таблицы, используя Hibernate.

Бывают ситуации, когда такая many-to-many ассоциация может быть эффективной, но я не уверен, что это ваш случай. Например, представьте, как вы удалите подписчика пользователя.

Вы можете попробовать другой подход: добавить отдельную сущность для следующего отношения

@Enity
class Following {

  @ManyToOne(fetch = FetchType.LAZY)
  User from;

  @ManyToOne(fetch = FetchType.LAZY)
  User to;

}

Также вы можете добавить уникальное ограничение: (from, to) может подойти.

...